1/* SPDX-License-Identifier: GPL-2.0 */ 2#include <asm/vdso.h> 3#include <asm/vdso/vsyscall.h> 4 5/* 6 * Linker script for vDSO. This is an ELF shared object prelinked to 7 * its virtual address, and with only one read-only segment. 8 * This script controls its layout. 9 */ 10 11SECTIONS 12{ 13 /* 14 * User/kernel shared data is before the vDSO. This may be a little 15 * uglier than putting it after the vDSO, but it avoids issues with 16 * non-allocatable things that dangle past the end of the PT_LOAD 17 * segment. 18 */ 19 20 vvar_start = . - __VVAR_PAGES * PAGE_SIZE; 21 vvar_page = vvar_start; 22 23 vdso_rng_data = vvar_page + __VDSO_RND_DATA_OFFSET; 24 25 timens_page = vvar_start + PAGE_SIZE; 26 27 vclock_pages = vvar_start + VDSO_NR_VCLOCK_PAGES * PAGE_SIZE; 28 pvclock_page = vclock_pages + VDSO_PAGE_PVCLOCK_OFFSET * PAGE_SIZE; 29 hvclock_page = vclock_pages + VDSO_PAGE_HVCLOCK_OFFSET * PAGE_SIZE; 30 31 . = SIZEOF_HEADERS; 32 33 .hash : { *(.hash) } :text 34 .gnu.hash : { *(.gnu.hash) } 35 .dynsym : { *(.dynsym) } 36 .dynstr : { *(.dynstr) } 37 .gnu.version : { *(.gnu.version) } 38 .gnu.version_d : { *(.gnu.version_d) } 39 .gnu.version_r : { *(.gnu.version_r) } 40 41 .dynamic : { *(.dynamic) } :text :dynamic 42 43 .rodata : { 44 *(.rodata*) 45 *(.data*) 46 *(.sdata*) 47 *(.got.plt) *(.got) 48 *(.gnu.linkonce.d.*) 49 *(.bss*) 50 *(.dynbss*) 51 *(.gnu.linkonce.b.*) 52 } :text 53 54 /* 55 * Discard .note.gnu.property sections which are unused and have 56 * different alignment requirement from vDSO note sections. 57 */ 58 /DISCARD/ : { 59 *(.note.gnu.property) 60 } 61 .note : { *(.note.*) } :text :note 62 63 .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr 64 .eh_frame : { KEEP (*(.eh_frame)) } :text 65 66 67 /* 68 * Text is well-separated from actual data: there's plenty of 69 * stuff that isn't used at runtime in between. 70 */ 71 72 .text : { 73 *(.text*) 74 } :text =0x90909090, 75 76 77 78 .altinstructions : { *(.altinstructions) } :text 79 .altinstr_replacement : { *(.altinstr_replacement) } :text 80 81 __ex_table : { *(__ex_table) } :text 82 83 /DISCARD/ : { 84 *(.discard) 85 *(.discard.*) 86 *(__bug_table) 87 } 88} 89 90/* 91 * Very old versions of ld do not recognize this name token; use the constant. 92 */ 93#define PT_GNU_EH_FRAME 0x6474e550 94 95/* 96 * We must supply the ELF program headers explicitly to get just one 97 * PT_LOAD segment, and set the flags explicitly to make segments read-only. 98 */ 99PHDRS 100{ 101 text PT_LOAD FLAGS(5) FILEHDR PHDRS; /* PF_R|PF_X */ 102 dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ 103 note PT_NOTE FLAGS(4); /* PF_R */ 104 eh_frame_hdr PT_GNU_EH_FRAME; 105} 106