1693c819fSH. Peter Anvin/* SPDX-License-Identifier: GPL-2.0 */ 2693c819fSH. Peter Anvin#include <asm/vdso.h> 3693c819fSH. Peter Anvin#include <asm/vdso/vsyscall.h> 4693c819fSH. Peter Anvin#include <vdso/datapage.h> 5693c819fSH. Peter Anvin 6693c819fSH. Peter Anvin/* 7693c819fSH. Peter Anvin * Linker script for vDSO. This is an ELF shared object prelinked to 8693c819fSH. Peter Anvin * its virtual address, and with only one read-only segment. 9693c819fSH. Peter Anvin * This script controls its layout. 10693c819fSH. Peter Anvin */ 11693c819fSH. Peter Anvin 12693c819fSH. Peter AnvinSECTIONS 13693c819fSH. Peter Anvin{ 14693c819fSH. Peter Anvin /* 15693c819fSH. Peter Anvin * User/kernel shared data is before the vDSO. This may be a little 16693c819fSH. Peter Anvin * uglier than putting it after the vDSO, but it avoids issues with 17693c819fSH. Peter Anvin * non-allocatable things that dangle past the end of the PT_LOAD 18693c819fSH. Peter Anvin * segment. 19693c819fSH. Peter Anvin */ 20693c819fSH. Peter Anvin 21693c819fSH. Peter Anvin VDSO_VVAR_SYMS 22693c819fSH. Peter Anvin 23693c819fSH. Peter Anvin vclock_pages = VDSO_VCLOCK_PAGES_START(vdso_u_data); 24693c819fSH. Peter Anvin pvclock_page = vclock_pages + VDSO_PAGE_PVCLOCK_OFFSET * PAGE_SIZE; 25693c819fSH. Peter Anvin hvclock_page = vclock_pages + VDSO_PAGE_HVCLOCK_OFFSET * PAGE_SIZE; 26693c819fSH. Peter Anvin 27693c819fSH. Peter Anvin . = SIZEOF_HEADERS; 28693c819fSH. Peter Anvin 29693c819fSH. Peter Anvin .hash : { *(.hash) } :text 30693c819fSH. Peter Anvin .gnu.hash : { *(.gnu.hash) } 31693c819fSH. Peter Anvin .dynsym : { *(.dynsym) } 32693c819fSH. Peter Anvin .dynstr : { *(.dynstr) } 33693c819fSH. Peter Anvin .gnu.version : { *(.gnu.version) } 34693c819fSH. Peter Anvin .gnu.version_d : { *(.gnu.version_d) } 35693c819fSH. Peter Anvin .gnu.version_r : { *(.gnu.version_r) } 36693c819fSH. Peter Anvin 37693c819fSH. Peter Anvin .dynamic : { *(.dynamic) } :text :dynamic 38693c819fSH. Peter Anvin 39693c819fSH. Peter Anvin .rodata : { 40693c819fSH. Peter Anvin *(.rodata*) 41693c819fSH. Peter Anvin *(.data*) 42693c819fSH. Peter Anvin *(.sdata*) 43693c819fSH. Peter Anvin *(.got.plt) *(.got) 44693c819fSH. Peter Anvin *(.gnu.linkonce.d.*) 45693c819fSH. Peter Anvin *(.bss*) 46693c819fSH. Peter Anvin *(.dynbss*) 47693c819fSH. Peter Anvin *(.gnu.linkonce.b.*) 48693c819fSH. Peter Anvin } :text 49693c819fSH. Peter Anvin 50*8717b02bSH. Peter Anvin .note.gnu.property : { 51693c819fSH. Peter Anvin *(.note.gnu.property) 52*8717b02bSH. Peter Anvin } :text :note :gnu_property 53*8717b02bSH. Peter Anvin .note : { 54*8717b02bSH. Peter Anvin *(.note*) 55*8717b02bSH. Peter Anvin } :text :note 56693c819fSH. Peter Anvin 57693c819fSH. Peter Anvin .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr 58*8717b02bSH. Peter Anvin .eh_frame : { 59*8717b02bSH. Peter Anvin KEEP (*(.eh_frame)) 60*8717b02bSH. Peter Anvin *(.eh_frame.*) 61*8717b02bSH. Peter Anvin } :text 62693c819fSH. Peter Anvin 63693c819fSH. Peter Anvin /* 64693c819fSH. Peter Anvin * Text is well-separated from actual data: there's plenty of 65693c819fSH. Peter Anvin * stuff that isn't used at runtime in between. 66693c819fSH. Peter Anvin */ 67693c819fSH. Peter Anvin 68693c819fSH. Peter Anvin .text : { 69693c819fSH. Peter Anvin *(.text*) 70693c819fSH. Peter Anvin } :text =0x90909090, 71693c819fSH. Peter Anvin 72693c819fSH. Peter Anvin 73693c819fSH. Peter Anvin 74693c819fSH. Peter Anvin .altinstructions : { *(.altinstructions) } :text 75693c819fSH. Peter Anvin .altinstr_replacement : { *(.altinstr_replacement) } :text 76693c819fSH. Peter Anvin 77693c819fSH. Peter Anvin __ex_table : { *(__ex_table) } :text 78693c819fSH. Peter Anvin 79693c819fSH. Peter Anvin /DISCARD/ : { 80693c819fSH. Peter Anvin *(.discard) 81693c819fSH. Peter Anvin *(.discard.*) 82693c819fSH. Peter Anvin *(__bug_table) 83693c819fSH. Peter Anvin } 84693c819fSH. Peter Anvin} 85693c819fSH. Peter Anvin 86693c819fSH. Peter Anvin/* 87693c819fSH. Peter Anvin * Very old versions of ld do not recognize this name token; use the constant. 88693c819fSH. Peter Anvin */ 89693c819fSH. Peter Anvin#define PT_GNU_EH_FRAME 0x6474e550 90*8717b02bSH. Peter Anvin#define PT_GNU_STACK 0x6474e551 91*8717b02bSH. Peter Anvin#define PT_GNU_PROPERTY 0x6474e553 92693c819fSH. Peter Anvin 93693c819fSH. Peter Anvin/* 94693c819fSH. Peter Anvin * We must supply the ELF program headers explicitly to get just one 95693c819fSH. Peter Anvin * PT_LOAD segment, and set the flags explicitly to make segments read-only. 96693c819fSH. Peter Anvin*/ 97*8717b02bSH. Peter Anvin#define PF_R FLAGS(4) 98*8717b02bSH. Peter Anvin#define PF_RW FLAGS(6) 99*8717b02bSH. Peter Anvin#define PF_RX FLAGS(5) 100*8717b02bSH. Peter Anvin 101693c819fSH. Peter AnvinPHDRS 102693c819fSH. Peter Anvin{ 103*8717b02bSH. Peter Anvin text PT_LOAD PF_RX FILEHDR PHDRS; 104*8717b02bSH. Peter Anvin dynamic PT_DYNAMIC PF_R; 105*8717b02bSH. Peter Anvin note PT_NOTE PF_R; 106*8717b02bSH. Peter Anvin eh_frame_hdr PT_GNU_EH_FRAME PF_R; 107*8717b02bSH. Peter Anvin gnu_stack PT_GNU_STACK PF_RW; 108*8717b02bSH. Peter Anvin gnu_property PT_GNU_PROPERTY PF_R; 109693c819fSH. Peter Anvin} 110