1*c0087d80SHeiko Carstens/* SPDX-License-Identifier: GPL-2.0 */ 2*c0087d80SHeiko Carstens/* 3*c0087d80SHeiko Carstens * This is the infamous ld script for the 64 bits vdso 4*c0087d80SHeiko Carstens * library 5*c0087d80SHeiko Carstens */ 6*c0087d80SHeiko Carstens 7*c0087d80SHeiko Carstens#include <asm/vdso/vsyscall.h> 8*c0087d80SHeiko Carstens#include <asm/page.h> 9*c0087d80SHeiko Carstens#include <asm/vdso.h> 10*c0087d80SHeiko Carstens#include <asm-generic/vmlinux.lds.h> 11*c0087d80SHeiko Carstens#include <vdso/datapage.h> 12*c0087d80SHeiko Carstens 13*c0087d80SHeiko CarstensOUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390") 14*c0087d80SHeiko CarstensOUTPUT_ARCH(s390:64-bit) 15*c0087d80SHeiko Carstens 16*c0087d80SHeiko CarstensSECTIONS 17*c0087d80SHeiko Carstens{ 18*c0087d80SHeiko Carstens VDSO_VVAR_SYMS 19*c0087d80SHeiko Carstens 20*c0087d80SHeiko Carstens . = SIZEOF_HEADERS; 21*c0087d80SHeiko Carstens 22*c0087d80SHeiko Carstens .hash : { *(.hash) } :text 23*c0087d80SHeiko Carstens .gnu.hash : { *(.gnu.hash) } 24*c0087d80SHeiko Carstens .dynsym : { *(.dynsym) } 25*c0087d80SHeiko Carstens .dynstr : { *(.dynstr) } 26*c0087d80SHeiko Carstens .gnu.version : { *(.gnu.version) } 27*c0087d80SHeiko Carstens .gnu.version_d : { *(.gnu.version_d) } 28*c0087d80SHeiko Carstens .gnu.version_r : { *(.gnu.version_r) } 29*c0087d80SHeiko Carstens 30*c0087d80SHeiko Carstens .note : { *(.note.*) } :text :note 31*c0087d80SHeiko Carstens 32*c0087d80SHeiko Carstens . = ALIGN(16); 33*c0087d80SHeiko Carstens .text : { 34*c0087d80SHeiko Carstens *(.text .stub .text.* .gnu.linkonce.t.*) 35*c0087d80SHeiko Carstens } :text 36*c0087d80SHeiko Carstens PROVIDE(__etext = .); 37*c0087d80SHeiko Carstens PROVIDE(_etext = .); 38*c0087d80SHeiko Carstens PROVIDE(etext = .); 39*c0087d80SHeiko Carstens 40*c0087d80SHeiko Carstens /* 41*c0087d80SHeiko Carstens * Other stuff is appended to the text segment: 42*c0087d80SHeiko Carstens */ 43*c0087d80SHeiko Carstens .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } 44*c0087d80SHeiko Carstens .rodata1 : { *(.rodata1) } 45*c0087d80SHeiko Carstens 46*c0087d80SHeiko Carstens . = ALIGN(8); 47*c0087d80SHeiko Carstens .altinstructions : { *(.altinstructions) } 48*c0087d80SHeiko Carstens .altinstr_replacement : { *(.altinstr_replacement) } 49*c0087d80SHeiko Carstens 50*c0087d80SHeiko Carstens .dynamic : { *(.dynamic) } :text :dynamic 51*c0087d80SHeiko Carstens 52*c0087d80SHeiko Carstens .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr 53*c0087d80SHeiko Carstens .eh_frame : { KEEP (*(.eh_frame)) } :text 54*c0087d80SHeiko Carstens .gcc_except_table : { *(.gcc_except_table .gcc_except_table.*) } 55*c0087d80SHeiko Carstens 56*c0087d80SHeiko Carstens .rela.dyn ALIGN(8) : { *(.rela.dyn) } 57*c0087d80SHeiko Carstens .got ALIGN(8) : { *(.got .toc) } 58*c0087d80SHeiko Carstens .got.plt ALIGN(8) : { *(.got.plt) } 59*c0087d80SHeiko Carstens 60*c0087d80SHeiko Carstens _end = .; 61*c0087d80SHeiko Carstens PROVIDE(end = .); 62*c0087d80SHeiko Carstens 63*c0087d80SHeiko Carstens STABS_DEBUG 64*c0087d80SHeiko Carstens DWARF_DEBUG 65*c0087d80SHeiko Carstens .comment 0 : { *(.comment) } 66*c0087d80SHeiko Carstens .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } 67*c0087d80SHeiko Carstens 68*c0087d80SHeiko Carstens /DISCARD/ : { 69*c0087d80SHeiko Carstens *(.note.GNU-stack) 70*c0087d80SHeiko Carstens *(.branch_lt) 71*c0087d80SHeiko Carstens *(.data .data.* .gnu.linkonce.d.* .sdata*) 72*c0087d80SHeiko Carstens *(.bss .sbss .dynbss .dynsbss) 73*c0087d80SHeiko Carstens } 74*c0087d80SHeiko Carstens} 75*c0087d80SHeiko Carstens 76*c0087d80SHeiko Carstens/* 77*c0087d80SHeiko Carstens * Very old versions of ld do not recognize this name token; use the constant. 78*c0087d80SHeiko Carstens */ 79*c0087d80SHeiko Carstens#define PT_GNU_EH_FRAME 0x6474e550 80*c0087d80SHeiko Carstens 81*c0087d80SHeiko Carstens/* 82*c0087d80SHeiko Carstens * We must supply the ELF program headers explicitly to get just one 83*c0087d80SHeiko Carstens * PT_LOAD segment, and set the flags explicitly to make segments read-only. 84*c0087d80SHeiko Carstens */ 85*c0087d80SHeiko CarstensPHDRS 86*c0087d80SHeiko Carstens{ 87*c0087d80SHeiko Carstens text PT_LOAD FILEHDR PHDRS FLAGS(5); /* PF_R|PF_X */ 88*c0087d80SHeiko Carstens dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ 89*c0087d80SHeiko Carstens note PT_NOTE FLAGS(4); /* PF_R */ 90*c0087d80SHeiko Carstens eh_frame_hdr PT_GNU_EH_FRAME; 91*c0087d80SHeiko Carstens} 92*c0087d80SHeiko Carstens 93*c0087d80SHeiko Carstens/* 94*c0087d80SHeiko Carstens * This controls what symbols we export from the DSO. 95*c0087d80SHeiko Carstens */ 96*c0087d80SHeiko CarstensVERSION 97*c0087d80SHeiko Carstens{ 98*c0087d80SHeiko Carstens VDSO_VERSION_STRING { 99*c0087d80SHeiko Carstens global: 100*c0087d80SHeiko Carstens /* 101*c0087d80SHeiko Carstens * Has to be there for the kernel to find 102*c0087d80SHeiko Carstens */ 103*c0087d80SHeiko Carstens __kernel_gettimeofday; 104*c0087d80SHeiko Carstens __kernel_clock_gettime; 105*c0087d80SHeiko Carstens __kernel_clock_getres; 106*c0087d80SHeiko Carstens __kernel_getcpu; 107*c0087d80SHeiko Carstens __kernel_restart_syscall; 108*c0087d80SHeiko Carstens __kernel_rt_sigreturn; 109*c0087d80SHeiko Carstens __kernel_sigreturn; 110*c0087d80SHeiko Carstens __kernel_getrandom; 111*c0087d80SHeiko Carstens local: *; 112*c0087d80SHeiko Carstens }; 113*c0087d80SHeiko Carstens} 114