1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 21da177e4SLinus Torvalds/* 31da177e4SLinus Torvalds * This is the infamous ld script for the 32 bits vdso 41da177e4SLinus Torvalds * library 51da177e4SLinus Torvalds */ 61da177e4SLinus Torvalds#include <asm/vdso.h> 7591857b6SChristophe Leroy#include <asm/page.h> 8a21df7a1SYouling Tang#include <asm-generic/vmlinux.lds.h> 9*223970dfSThomas Weißschuh#include <vdso/datapage.h> 101da177e4SLinus Torvalds 11d72b0801SIan Munsie#ifdef __LITTLE_ENDIAN__ 12d72b0801SIan MunsieOUTPUT_FORMAT("elf32-powerpcle", "elf32-powerpcle", "elf32-powerpcle") 13d72b0801SIan Munsie#else 141da177e4SLinus TorvaldsOUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc") 15d72b0801SIan Munsie#endif 161da177e4SLinus TorvaldsOUTPUT_ARCH(powerpc:common) 171da177e4SLinus Torvalds 181da177e4SLinus TorvaldsSECTIONS 191da177e4SLinus Torvalds{ 20*223970dfSThomas Weißschuh VDSO_VVAR_SYMS 21*223970dfSThomas Weißschuh 22676155abSChristophe Leroy . = SIZEOF_HEADERS; 23d4c9f23aSRoland McGrath 241da177e4SLinus Torvalds .hash : { *(.hash) } :text 250b0bf7a3SRoland McGrath .gnu.hash : { *(.gnu.hash) } 261da177e4SLinus Torvalds .dynsym : { *(.dynsym) } 271da177e4SLinus Torvalds .dynstr : { *(.dynstr) } 281da177e4SLinus Torvalds .gnu.version : { *(.gnu.version) } 291da177e4SLinus Torvalds .gnu.version_d : { *(.gnu.version_d) } 301da177e4SLinus Torvalds .gnu.version_r : { *(.gnu.version_r) } 311da177e4SLinus Torvalds 321b29f9d1SBenjamin Herrenschmidt .note : { *(.note.*) } :text :note 331b29f9d1SBenjamin Herrenschmidt 341da177e4SLinus Torvalds . = ALIGN(16); 35d4c9f23aSRoland McGrath .text : { 36fac23fe4SMichael Ellerman *(.text .stub .text.* .gnu.linkonce.t.* __ftr_alt_*) 377de80284SAndreas Schwab } :text 381da177e4SLinus Torvalds PROVIDE(__etext = .); 391da177e4SLinus Torvalds PROVIDE(_etext = .); 401da177e4SLinus Torvalds PROVIDE(etext = .); 411da177e4SLinus Torvalds 420909c8c2SBenjamin Herrenschmidt . = ALIGN(8); 43ed07f635SChristophe Leroy VDSO_ftr_fixup_start = .; 44d4c9f23aSRoland McGrath __ftr_fixup : { *(__ftr_fixup) } 45ed07f635SChristophe Leroy VDSO_ftr_fixup_end = .; 460909c8c2SBenjamin Herrenschmidt 472d1b2027SKumar Gala . = ALIGN(8); 48ed07f635SChristophe Leroy VDSO_mmu_ftr_fixup_start = .; 497c03d653SBenjamin Herrenschmidt __mmu_ftr_fixup : { *(__mmu_ftr_fixup) } 50ed07f635SChristophe Leroy VDSO_mmu_ftr_fixup_end = .; 517c03d653SBenjamin Herrenschmidt 527c03d653SBenjamin Herrenschmidt . = ALIGN(8); 53ed07f635SChristophe Leroy VDSO_lwsync_fixup_start = .; 542d1b2027SKumar Gala __lwsync_fixup : { *(__lwsync_fixup) } 55ed07f635SChristophe Leroy VDSO_lwsync_fixup_end = .; 562d1b2027SKumar Gala 570909c8c2SBenjamin Herrenschmidt#ifdef CONFIG_PPC64 580909c8c2SBenjamin Herrenschmidt . = ALIGN(8); 59ed07f635SChristophe Leroy VDSO_fw_ftr_fixup_start = .; 60d4c9f23aSRoland McGrath __fw_ftr_fixup : { *(__fw_ftr_fixup) } 61ed07f635SChristophe Leroy VDSO_fw_ftr_fixup_end = .; 620909c8c2SBenjamin Herrenschmidt#endif 630909c8c2SBenjamin Herrenschmidt 64d4c9f23aSRoland McGrath /* 65d4c9f23aSRoland McGrath * Other stuff is appended to the text segment: 66d4c9f23aSRoland McGrath */ 671da177e4SLinus Torvalds .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } 681da177e4SLinus Torvalds .rodata1 : { *(.rodata1) } 691da177e4SLinus Torvalds 701da177e4SLinus Torvalds .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr 711da177e4SLinus Torvalds .eh_frame : { KEEP (*(.eh_frame)) } :text 721da177e4SLinus Torvalds .gcc_except_table : { *(.gcc_except_table) } 731da177e4SLinus Torvalds .fixup : { *(.fixup) } 741da177e4SLinus Torvalds 751da177e4SLinus Torvalds .dynamic : { *(.dynamic) } :text :dynamic 767de80284SAndreas Schwab .got : { *(.got) } :text 772098eec2SOlaf Hering .plt : { *(.plt) } 781da177e4SLinus Torvalds 796114139cSChristophe Leroy .rela.dyn : { *(.rela .rela*) } 806114139cSChristophe Leroy 811da177e4SLinus Torvalds _end = .; 821da177e4SLinus Torvalds __end = .; 831da177e4SLinus Torvalds PROVIDE(end = .); 841da177e4SLinus Torvalds 85a21df7a1SYouling Tang DWARF_DEBUG 86a21df7a1SYouling Tang ELF_DETAILS 871da177e4SLinus Torvalds 88d4c9f23aSRoland McGrath /DISCARD/ : { 89d4c9f23aSRoland McGrath *(.note.GNU-stack) 908ad57addSNicholas Piggin *(*.EMB.apuinfo) 918ad57addSNicholas Piggin *(.branch_lt) 92d4c9f23aSRoland McGrath *(.data .data.* .gnu.linkonce.d.* .sdata*) 93d4c9f23aSRoland McGrath *(.bss .sbss .dynbss .dynsbss) 946114139cSChristophe Leroy *(.got1 .glink .iplt) 95d4c9f23aSRoland McGrath } 961da177e4SLinus Torvalds} 971da177e4SLinus Torvalds 98d4c9f23aSRoland McGrath/* 99d4c9f23aSRoland McGrath * Very old versions of ld do not recognize this name token; use the constant. 100d4c9f23aSRoland McGrath */ 101d4c9f23aSRoland McGrath#define PT_GNU_EH_FRAME 0x6474e550 1021da177e4SLinus Torvalds 103d4c9f23aSRoland McGrath/* 104d4c9f23aSRoland McGrath * We must supply the ELF program headers explicitly to get just one 105d4c9f23aSRoland McGrath * PT_LOAD segment, and set the flags explicitly to make segments read-only. 106d4c9f23aSRoland McGrath */ 1071da177e4SLinus TorvaldsPHDRS 1081da177e4SLinus Torvalds{ 1091da177e4SLinus Torvalds text PT_LOAD FILEHDR PHDRS FLAGS(5); /* PF_R|PF_X */ 1101da177e4SLinus Torvalds dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ 111d4c9f23aSRoland McGrath note PT_NOTE FLAGS(4); /* PF_R */ 112d4c9f23aSRoland McGrath eh_frame_hdr PT_GNU_EH_FRAME; 1131da177e4SLinus Torvalds} 1141da177e4SLinus Torvalds 1151da177e4SLinus Torvalds/* 1161da177e4SLinus Torvalds * This controls what symbols we export from the DSO. 1171da177e4SLinus Torvalds */ 1181da177e4SLinus TorvaldsVERSION 1191da177e4SLinus Torvalds{ 1201da177e4SLinus Torvalds VDSO_VERSION_STRING { 1211da177e4SLinus Torvalds global: 1221da177e4SLinus Torvalds __kernel_get_syscall_map; 1231da177e4SLinus Torvalds __kernel_gettimeofday; 124a7f290daSBenjamin Herrenschmidt __kernel_clock_gettime; 125d0e3fc69SChristophe Leroy __kernel_clock_gettime64; 126a7f290daSBenjamin Herrenschmidt __kernel_clock_getres; 12788fb3094SChristophe Leroy __kernel_time; 128a7f290daSBenjamin Herrenschmidt __kernel_get_tbfreq; 1291da177e4SLinus Torvalds __kernel_sync_dicache; 1301da177e4SLinus Torvalds __kernel_sigtramp32; 1311da177e4SLinus Torvalds __kernel_sigtramp_rt32; 132902137baSChristophe Leroy#if defined(CONFIG_PPC64) || !defined(CONFIG_SMP) 13318ad51ddSAnton Blanchard __kernel_getcpu; 13418ad51ddSAnton Blanchard#endif 13553cee505SChristophe Leroy __kernel_getrandom; 136d4c9f23aSRoland McGrath 1371da177e4SLinus Torvalds local: *; 1381da177e4SLinus Torvalds }; 1391da177e4SLinus Torvalds} 14091bf6955SChristophe Leroy 14191bf6955SChristophe Leroy/* 14291bf6955SChristophe Leroy * Make the sigreturn code visible to the kernel. 14391bf6955SChristophe Leroy */ 14491bf6955SChristophe LeroyVDSO_sigtramp32 = __kernel_sigtramp32; 14591bf6955SChristophe LeroyVDSO_sigtramp_rt32 = __kernel_sigtramp_rt32; 146