1/* 2 * Linker script for vDSO. This is an ELF shared object prelinked to 3 * its virtual address, and with only one read-only segment. 4 * This script controls its layout. 5 */ 6 7#if defined(BUILD_VDSO64) 8# define SHDR_SIZE 64 9#elif defined(BUILD_VDSO32) 10# define SHDR_SIZE 40 11#else 12# error unknown VDSO target 13#endif 14 15#define NUM_FAKE_SHDRS 7 16 17SECTIONS 18{ 19 /* 20 * User/kernel shared data is before the vDSO. This may be a little 21 * uglier than putting it after the vDSO, but it avoids issues with 22 * non-allocatable things that dangle past the end of the PT_LOAD 23 * segment. Page size is 8192 for both 64-bit and 32-bit vdso binaries 24 */ 25 26 vvar_start = . -8192; 27 vvar_data = vvar_start; 28 29 . = SIZEOF_HEADERS; 30 31 .hash : { *(.hash) } :text 32 .gnu.hash : { *(.gnu.hash) } 33 .dynsym : { *(.dynsym) } 34 .dynstr : { *(.dynstr) } 35 .gnu.version : { *(.gnu.version) } 36 .gnu.version_d : { *(.gnu.version_d) } 37 .gnu.version_r : { *(.gnu.version_r) } 38 39 .dynamic : { *(.dynamic) } :text :dynamic 40 41 .rodata : { 42 *(.rodata*) 43 *(.data*) 44 *(.sdata*) 45 *(.got.plt) *(.got) 46 *(.gnu.linkonce.d.*) 47 *(.bss*) 48 *(.dynbss*) 49 *(.gnu.linkonce.b.*) 50 51 /* 52 * Ideally this would live in a C file: kept in here for 53 * compatibility with x86-64. 54 */ 55 VDSO_FAKE_SECTION_TABLE_START = .; 56 . = . + NUM_FAKE_SHDRS * SHDR_SIZE; 57 VDSO_FAKE_SECTION_TABLE_END = .; 58 } :text 59 60 .fake_shstrtab : { *(.fake_shstrtab) } :text 61 62 63 .note : { *(.note.*) } :text :note 64 65 .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr 66 .eh_frame : { KEEP (*(.eh_frame)) } :text 67 68 69 /* 70 * Text is well-separated from actual data: there's plenty of 71 * stuff that isn't used at runtime in between. 72 */ 73 74 .text : { *(.text*) } :text =0x90909090, 75 76 .vread_tick_patch : { 77 vread_tick_patch_start = .; 78 *(.vread_tick_patch) 79 vread_tick_patch_end = .; 80 } 81 82 /DISCARD/ : { 83 *(.discard) 84 *(.discard.*) 85 *(__bug_table) 86 } 87} 88 89/* 90 * Very old versions of ld do not recognize this name token; use the constant. 91 */ 92#define PT_GNU_EH_FRAME 0x6474e550 93 94/* 95 * We must supply the ELF program headers explicitly to get just one 96 * PT_LOAD segment, and set the flags explicitly to make segments read-only. 97 */ 98PHDRS 99{ 100 text PT_LOAD FLAGS(5) FILEHDR PHDRS; /* PF_R|PF_X */ 101 dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ 102 note PT_NOTE FLAGS(4); /* PF_R */ 103 eh_frame_hdr PT_GNU_EH_FRAME; 104} 105