1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 2d603c8e1SIngo Molnar#include <asm/vdso.h> 3d603c8e1SIngo Molnar 4d603c8e1SIngo Molnar/* 5d603c8e1SIngo Molnar * Linker script for vDSO. This is an ELF shared object prelinked to 6d603c8e1SIngo Molnar * its virtual address, and with only one read-only segment. 7d603c8e1SIngo Molnar * This script controls its layout. 8d603c8e1SIngo Molnar */ 9d603c8e1SIngo Molnar 10d603c8e1SIngo MolnarSECTIONS 11d603c8e1SIngo Molnar{ 12d603c8e1SIngo Molnar /* 13d603c8e1SIngo Molnar * User/kernel shared data is before the vDSO. This may be a little 14d603c8e1SIngo Molnar * uglier than putting it after the vDSO, but it avoids issues with 15d603c8e1SIngo Molnar * non-allocatable things that dangle past the end of the PT_LOAD 16d603c8e1SIngo Molnar * segment. 17d603c8e1SIngo Molnar */ 18d603c8e1SIngo Molnar 19550a77a7SDmitry Safonov vvar_start = . - 4 * PAGE_SIZE; 20d603c8e1SIngo Molnar vvar_page = vvar_start; 21d603c8e1SIngo Molnar 22d603c8e1SIngo Molnar /* Place all vvars at the offsets in asm/vvar.h. */ 23d603c8e1SIngo Molnar#define EMIT_VVAR(name, offset) vvar_ ## name = vvar_page + offset; 24d603c8e1SIngo Molnar#include <asm/vvar.h> 25d603c8e1SIngo Molnar#undef EMIT_VVAR 26d603c8e1SIngo Molnar 271ed95e52SAndy Lutomirski pvclock_page = vvar_start + PAGE_SIZE; 2890b20432SVitaly Kuznetsov hvclock_page = vvar_start + 2 * PAGE_SIZE; 29550a77a7SDmitry Safonov timens_page = vvar_start + 3 * PAGE_SIZE; 30550a77a7SDmitry Safonov 31550a77a7SDmitry Safonov#undef _ASM_X86_VVAR_H 32550a77a7SDmitry Safonov /* Place all vvars in timens too at the offsets in asm/vvar.h. */ 33550a77a7SDmitry Safonov#define EMIT_VVAR(name, offset) timens_ ## name = timens_page + offset; 34550a77a7SDmitry Safonov#include <asm/vvar.h> 35550a77a7SDmitry Safonov#undef EMIT_VVAR 36d603c8e1SIngo Molnar 37d603c8e1SIngo Molnar . = SIZEOF_HEADERS; 38d603c8e1SIngo Molnar 39d603c8e1SIngo Molnar .hash : { *(.hash) } :text 40d603c8e1SIngo Molnar .gnu.hash : { *(.gnu.hash) } 41d603c8e1SIngo Molnar .dynsym : { *(.dynsym) } 42d603c8e1SIngo Molnar .dynstr : { *(.dynstr) } 43d603c8e1SIngo Molnar .gnu.version : { *(.gnu.version) } 44d603c8e1SIngo Molnar .gnu.version_d : { *(.gnu.version_d) } 45d603c8e1SIngo Molnar .gnu.version_r : { *(.gnu.version_r) } 46d603c8e1SIngo Molnar 47d603c8e1SIngo Molnar .dynamic : { *(.dynamic) } :text :dynamic 48d603c8e1SIngo Molnar 49d603c8e1SIngo Molnar .rodata : { 50d603c8e1SIngo Molnar *(.rodata*) 51d603c8e1SIngo Molnar *(.data*) 52d603c8e1SIngo Molnar *(.sdata*) 53d603c8e1SIngo Molnar *(.got.plt) *(.got) 54d603c8e1SIngo Molnar *(.gnu.linkonce.d.*) 55d603c8e1SIngo Molnar *(.bss*) 56d603c8e1SIngo Molnar *(.dynbss*) 57d603c8e1SIngo Molnar *(.gnu.linkonce.b.*) 58d603c8e1SIngo Molnar } :text 59d603c8e1SIngo Molnar 604caffe6aSH.J. Lu /* 614caffe6aSH.J. Lu * Discard .note.gnu.property sections which are unused and have 624caffe6aSH.J. Lu * different alignment requirement from vDSO note sections. 634caffe6aSH.J. Lu */ 644caffe6aSH.J. Lu /DISCARD/ : { 654caffe6aSH.J. Lu *(.note.gnu.property) 664caffe6aSH.J. Lu } 67d603c8e1SIngo Molnar .note : { *(.note.*) } :text :note 68d603c8e1SIngo Molnar 69d603c8e1SIngo Molnar .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr 70d603c8e1SIngo Molnar .eh_frame : { KEEP (*(.eh_frame)) } :text 71d603c8e1SIngo Molnar 72d603c8e1SIngo Molnar 73d603c8e1SIngo Molnar /* 74d603c8e1SIngo Molnar * Text is well-separated from actual data: there's plenty of 75d603c8e1SIngo Molnar * stuff that isn't used at runtime in between. 76d603c8e1SIngo Molnar */ 77d603c8e1SIngo Molnar 78*8382c668SSean Christopherson .text : { 79*8382c668SSean Christopherson *(.text*) 80*8382c668SSean Christopherson } :text =0x90909090, 81*8382c668SSean Christopherson 82*8382c668SSean Christopherson 83d603c8e1SIngo Molnar 84d603c8e1SIngo Molnar .altinstructions : { *(.altinstructions) } :text 85d603c8e1SIngo Molnar .altinstr_replacement : { *(.altinstr_replacement) } :text 86d603c8e1SIngo Molnar 87*8382c668SSean Christopherson __ex_table : { *(__ex_table) } :text 88*8382c668SSean Christopherson 89d603c8e1SIngo Molnar /DISCARD/ : { 90d603c8e1SIngo Molnar *(.discard) 91d603c8e1SIngo Molnar *(.discard.*) 92d603c8e1SIngo Molnar *(__bug_table) 93d603c8e1SIngo Molnar } 94d603c8e1SIngo Molnar} 95d603c8e1SIngo Molnar 96d603c8e1SIngo Molnar/* 97d603c8e1SIngo Molnar * Very old versions of ld do not recognize this name token; use the constant. 98d603c8e1SIngo Molnar */ 99d603c8e1SIngo Molnar#define PT_GNU_EH_FRAME 0x6474e550 100d603c8e1SIngo Molnar 101d603c8e1SIngo Molnar/* 102d603c8e1SIngo Molnar * We must supply the ELF program headers explicitly to get just one 103d603c8e1SIngo Molnar * PT_LOAD segment, and set the flags explicitly to make segments read-only. 104d603c8e1SIngo Molnar */ 105d603c8e1SIngo MolnarPHDRS 106d603c8e1SIngo Molnar{ 107d603c8e1SIngo Molnar text PT_LOAD FLAGS(5) FILEHDR PHDRS; /* PF_R|PF_X */ 108d603c8e1SIngo Molnar dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ 109d603c8e1SIngo Molnar note PT_NOTE FLAGS(4); /* PF_R */ 110d603c8e1SIngo Molnar eh_frame_hdr PT_GNU_EH_FRAME; 111d603c8e1SIngo Molnar} 112