1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 2b020632eSMartin Schwidefsky/* 3b020632eSMartin Schwidefsky * This is the infamous ld script for the 64 bits vdso 4b020632eSMartin Schwidefsky * library 5b020632eSMartin Schwidefsky */ 6f1c1174fSHeiko Carstens 7f1c1174fSHeiko Carstens#include <asm/page.h> 8b020632eSMartin Schwidefsky#include <asm/vdso.h> 9b020632eSMartin Schwidefsky 10b020632eSMartin SchwidefskyOUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390") 11b020632eSMartin SchwidefskyOUTPUT_ARCH(s390:64-bit) 12b020632eSMartin SchwidefskyENTRY(_start) 13b020632eSMartin Schwidefsky 14b020632eSMartin SchwidefskySECTIONS 15b020632eSMartin Schwidefsky{ 16eeab78b0SHeiko Carstens PROVIDE(_vdso_data = . - __VVAR_PAGES * PAGE_SIZE); 17eeab78b0SHeiko Carstens#ifdef CONFIG_TIME_NS 18eeab78b0SHeiko Carstens PROVIDE(_timens_data = _vdso_data + PAGE_SIZE); 19eeab78b0SHeiko Carstens#endif 2043e1f76bSSven Schnelle . = VDSO_LBASE + SIZEOF_HEADERS; 21b020632eSMartin Schwidefsky 22b020632eSMartin Schwidefsky .hash : { *(.hash) } :text 23b020632eSMartin Schwidefsky .gnu.hash : { *(.gnu.hash) } 24b020632eSMartin Schwidefsky .dynsym : { *(.dynsym) } 25b020632eSMartin Schwidefsky .dynstr : { *(.dynstr) } 26b020632eSMartin Schwidefsky .gnu.version : { *(.gnu.version) } 27b020632eSMartin Schwidefsky .gnu.version_d : { *(.gnu.version_d) } 28b020632eSMartin Schwidefsky .gnu.version_r : { *(.gnu.version_r) } 29b020632eSMartin Schwidefsky 30b020632eSMartin Schwidefsky .note : { *(.note.*) } :text :note 31b020632eSMartin Schwidefsky 32b020632eSMartin Schwidefsky . = ALIGN(16); 33b020632eSMartin Schwidefsky .text : { 34b020632eSMartin Schwidefsky *(.text .stub .text.* .gnu.linkonce.t.*) 35b020632eSMartin Schwidefsky } :text 36b020632eSMartin Schwidefsky PROVIDE(__etext = .); 37b020632eSMartin Schwidefsky PROVIDE(_etext = .); 38b020632eSMartin Schwidefsky PROVIDE(etext = .); 39b020632eSMartin Schwidefsky 40b020632eSMartin Schwidefsky /* 41b020632eSMartin Schwidefsky * Other stuff is appended to the text segment: 42b020632eSMartin Schwidefsky */ 43b020632eSMartin Schwidefsky .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } 44b020632eSMartin Schwidefsky .rodata1 : { *(.rodata1) } 45b020632eSMartin Schwidefsky 46b020632eSMartin Schwidefsky .dynamic : { *(.dynamic) } :text :dynamic 47b020632eSMartin Schwidefsky 48b020632eSMartin Schwidefsky .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr 49b020632eSMartin Schwidefsky .eh_frame : { KEEP (*(.eh_frame)) } :text 50b020632eSMartin Schwidefsky .gcc_except_table : { *(.gcc_except_table .gcc_except_table.*) } 51b020632eSMartin Schwidefsky 52b020632eSMartin Schwidefsky .rela.dyn ALIGN(8) : { *(.rela.dyn) } 53b020632eSMartin Schwidefsky .got ALIGN(8) : { *(.got .toc) } 54*7561c14dSSumanth Korikkar .got.plt ALIGN(8) : { *(.got.plt) } 55b020632eSMartin Schwidefsky 56b020632eSMartin Schwidefsky _end = .; 57b020632eSMartin Schwidefsky PROVIDE(end = .); 58b020632eSMartin Schwidefsky 59b020632eSMartin Schwidefsky /* 60b020632eSMartin Schwidefsky * Stabs debugging sections are here too. 61b020632eSMartin Schwidefsky */ 62b020632eSMartin Schwidefsky .stab 0 : { *(.stab) } 63b020632eSMartin Schwidefsky .stabstr 0 : { *(.stabstr) } 64b020632eSMartin Schwidefsky .stab.excl 0 : { *(.stab.excl) } 65b020632eSMartin Schwidefsky .stab.exclstr 0 : { *(.stab.exclstr) } 66b020632eSMartin Schwidefsky .stab.index 0 : { *(.stab.index) } 67b020632eSMartin Schwidefsky .stab.indexstr 0 : { *(.stab.indexstr) } 68b020632eSMartin Schwidefsky .comment 0 : { *(.comment) } 69b020632eSMartin Schwidefsky 70b020632eSMartin Schwidefsky /* 71b020632eSMartin Schwidefsky * DWARF debug sections. 72b020632eSMartin Schwidefsky * Symbols in the DWARF debugging sections are relative to the 73b020632eSMartin Schwidefsky * beginning of the section so we begin them at 0. 74b020632eSMartin Schwidefsky */ 75b020632eSMartin Schwidefsky /* DWARF 1 */ 76b020632eSMartin Schwidefsky .debug 0 : { *(.debug) } 77b020632eSMartin Schwidefsky .line 0 : { *(.line) } 78b020632eSMartin Schwidefsky /* GNU DWARF 1 extensions */ 79b020632eSMartin Schwidefsky .debug_srcinfo 0 : { *(.debug_srcinfo) } 80b020632eSMartin Schwidefsky .debug_sfnames 0 : { *(.debug_sfnames) } 81b020632eSMartin Schwidefsky /* DWARF 1.1 and DWARF 2 */ 82b020632eSMartin Schwidefsky .debug_aranges 0 : { *(.debug_aranges) } 83b020632eSMartin Schwidefsky .debug_pubnames 0 : { *(.debug_pubnames) } 84b020632eSMartin Schwidefsky /* DWARF 2 */ 85b020632eSMartin Schwidefsky .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } 86b020632eSMartin Schwidefsky .debug_abbrev 0 : { *(.debug_abbrev) } 87b020632eSMartin Schwidefsky .debug_line 0 : { *(.debug_line) } 88b020632eSMartin Schwidefsky .debug_frame 0 : { *(.debug_frame) } 89b020632eSMartin Schwidefsky .debug_str 0 : { *(.debug_str) } 90b020632eSMartin Schwidefsky .debug_loc 0 : { *(.debug_loc) } 91b020632eSMartin Schwidefsky .debug_macinfo 0 : { *(.debug_macinfo) } 92b020632eSMartin Schwidefsky /* SGI/MIPS DWARF 2 extensions */ 93b020632eSMartin Schwidefsky .debug_weaknames 0 : { *(.debug_weaknames) } 94b020632eSMartin Schwidefsky .debug_funcnames 0 : { *(.debug_funcnames) } 95b020632eSMartin Schwidefsky .debug_typenames 0 : { *(.debug_typenames) } 96b020632eSMartin Schwidefsky .debug_varnames 0 : { *(.debug_varnames) } 97b020632eSMartin Schwidefsky /* DWARF 3 */ 98b020632eSMartin Schwidefsky .debug_pubtypes 0 : { *(.debug_pubtypes) } 99b020632eSMartin Schwidefsky .debug_ranges 0 : { *(.debug_ranges) } 100b020632eSMartin Schwidefsky .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } 101b020632eSMartin Schwidefsky 102b020632eSMartin Schwidefsky /DISCARD/ : { 103b020632eSMartin Schwidefsky *(.note.GNU-stack) 104b020632eSMartin Schwidefsky *(.branch_lt) 105b020632eSMartin Schwidefsky *(.data .data.* .gnu.linkonce.d.* .sdata*) 106b020632eSMartin Schwidefsky *(.bss .sbss .dynbss .dynsbss) 107b020632eSMartin Schwidefsky } 108b020632eSMartin Schwidefsky} 109b020632eSMartin Schwidefsky 110b020632eSMartin Schwidefsky/* 111b020632eSMartin Schwidefsky * Very old versions of ld do not recognize this name token; use the constant. 112b020632eSMartin Schwidefsky */ 113b020632eSMartin Schwidefsky#define PT_GNU_EH_FRAME 0x6474e550 114b020632eSMartin Schwidefsky 115b020632eSMartin Schwidefsky/* 116b020632eSMartin Schwidefsky * We must supply the ELF program headers explicitly to get just one 117b020632eSMartin Schwidefsky * PT_LOAD segment, and set the flags explicitly to make segments read-only. 118b020632eSMartin Schwidefsky */ 119b020632eSMartin SchwidefskyPHDRS 120b020632eSMartin Schwidefsky{ 121b020632eSMartin Schwidefsky text PT_LOAD FILEHDR PHDRS FLAGS(5); /* PF_R|PF_X */ 122b020632eSMartin Schwidefsky dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ 123b020632eSMartin Schwidefsky note PT_NOTE FLAGS(4); /* PF_R */ 124b020632eSMartin Schwidefsky eh_frame_hdr PT_GNU_EH_FRAME; 125b020632eSMartin Schwidefsky} 126b020632eSMartin Schwidefsky 127b020632eSMartin Schwidefsky/* 128b020632eSMartin Schwidefsky * This controls what symbols we export from the DSO. 129b020632eSMartin Schwidefsky */ 130b020632eSMartin SchwidefskyVERSION 131b020632eSMartin Schwidefsky{ 132b020632eSMartin Schwidefsky VDSO_VERSION_STRING { 133b020632eSMartin Schwidefsky global: 134b020632eSMartin Schwidefsky /* 135b020632eSMartin Schwidefsky * Has to be there for the kernel to find 136b020632eSMartin Schwidefsky */ 137b020632eSMartin Schwidefsky __kernel_gettimeofday; 138b020632eSMartin Schwidefsky __kernel_clock_gettime; 139b020632eSMartin Schwidefsky __kernel_clock_getres; 14080f06306SHeiko Carstens __kernel_getcpu; 141686341f2SSven Schnelle __kernel_restart_syscall; 142686341f2SSven Schnelle __kernel_rt_sigreturn; 143686341f2SSven Schnelle __kernel_sigreturn; 144b020632eSMartin Schwidefsky local: *; 145b020632eSMartin Schwidefsky }; 146b020632eSMartin Schwidefsky} 147