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