^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) #include <asm/vdso.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Linker script for vDSO. This is an ELF shared object prelinked to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * its virtual address, and with only one read-only segment.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * This script controls its layout.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) SECTIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * User/kernel shared data is before the vDSO. This may be a little
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * uglier than putting it after the vDSO, but it avoids issues with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * non-allocatable things that dangle past the end of the PT_LOAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * segment.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) vvar_start = . - 4 * PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) vvar_page = vvar_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /* Place all vvars at the offsets in asm/vvar.h. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define EMIT_VVAR(name, offset) vvar_ ## name = vvar_page + offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <asm/vvar.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #undef EMIT_VVAR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) pvclock_page = vvar_start + PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) hvclock_page = vvar_start + 2 * PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) timens_page = vvar_start + 3 * PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #undef _ASM_X86_VVAR_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) /* Place all vvars in timens too at the offsets in asm/vvar.h. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define EMIT_VVAR(name, offset) timens_ ## name = timens_page + offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <asm/vvar.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #undef EMIT_VVAR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) . = SIZEOF_HEADERS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) .hash : { *(.hash) } :text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) .gnu.hash : { *(.gnu.hash) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) .dynsym : { *(.dynsym) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) .dynstr : { *(.dynstr) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) .gnu.version : { *(.gnu.version) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) .gnu.version_d : { *(.gnu.version_d) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) .gnu.version_r : { *(.gnu.version_r) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) .dynamic : { *(.dynamic) } :text :dynamic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) .rodata : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) *(.rodata*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) *(.data*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) *(.sdata*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) *(.got.plt) *(.got)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) *(.gnu.linkonce.d.*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) *(.bss*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) *(.dynbss*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) *(.gnu.linkonce.b.*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) } :text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * Discard .note.gnu.property sections which are unused and have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) * different alignment requirement from vDSO note sections.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) /DISCARD/ : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) *(.note.gnu.property)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) .note : { *(.note.*) } :text :note
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) .eh_frame : { KEEP (*(.eh_frame)) } :text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * Text is well-separated from actual data: there's plenty of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * stuff that isn't used at runtime in between.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) .text : { *(.text*) } :text =0x90909090,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) .altinstructions : { *(.altinstructions) } :text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .altinstr_replacement : { *(.altinstr_replacement) } :text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) /DISCARD/ : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) *(.discard)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) *(.discard.*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) *(__bug_table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) * Very old versions of ld do not recognize this name token; use the constant.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define PT_GNU_EH_FRAME 0x6474e550
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * We must supply the ELF program headers explicitly to get just one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) * PT_LOAD segment, and set the flags explicitly to make segments read-only.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) PHDRS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) text PT_LOAD FLAGS(5) FILEHDR PHDRS; /* PF_R|PF_X */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) dynamic PT_DYNAMIC FLAGS(4); /* PF_R */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) note PT_NOTE FLAGS(4); /* PF_R */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) eh_frame_hdr PT_GNU_EH_FRAME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) }