1*b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 21da177e4SLinus Torvalds/* 31a43be74SRoland McGrath * Linker script for gate DSO. The gate pages are an ELF shared object 41a43be74SRoland McGrath * prelinked to its virtual address, with only one read-only segment and 51a43be74SRoland McGrath * one execute-only segment (both fit in one page). This script controls 61a43be74SRoland McGrath * its layout. 71da177e4SLinus Torvalds */ 81da177e4SLinus Torvalds 9c140d879SDavid Howells#include <asm/page.h> 101da177e4SLinus Torvalds 111da177e4SLinus TorvaldsSECTIONS 121da177e4SLinus Torvalds{ 131da177e4SLinus Torvalds . = GATE_ADDR + SIZEOF_HEADERS; 141da177e4SLinus Torvalds 151da177e4SLinus Torvalds .hash : { *(.hash) } :readable 160b0bf7a3SRoland McGrath .gnu.hash : { *(.gnu.hash) } 171da177e4SLinus Torvalds .dynsym : { *(.dynsym) } 181da177e4SLinus Torvalds .dynstr : { *(.dynstr) } 191da177e4SLinus Torvalds .gnu.version : { *(.gnu.version) } 201da177e4SLinus Torvalds .gnu.version_d : { *(.gnu.version_d) } 211da177e4SLinus Torvalds .gnu.version_r : { *(.gnu.version_r) } 221a43be74SRoland McGrath 23172c5106SRoland McGrath .note : { *(.note*) } :readable :note 24172c5106SRoland McGrath 251da177e4SLinus Torvalds .dynamic : { *(.dynamic) } :readable :dynamic 261da177e4SLinus Torvalds 271da177e4SLinus Torvalds /* 281a43be74SRoland McGrath * This linker script is used both with -r and with -shared. For 291a43be74SRoland McGrath * the layouts to match, we need to skip more than enough space for 301a43be74SRoland McGrath * the dynamic symbol table et al. If this amount is insufficient, 311a43be74SRoland McGrath * ld -shared will barf. Just increase it here. 321da177e4SLinus Torvalds */ 331f0abae8SAndrew Morton . = GATE_ADDR + 0x600; 341da177e4SLinus Torvalds 35dafb9320SDenys Vlasenko .data..patch : { 36e55645ecSLuis R. Rodriguez __start_gate_mckinley_e9_patchlist = .; 37dafb9320SDenys Vlasenko *(.data..patch.mckinley_e9) 38e55645ecSLuis R. Rodriguez __end_gate_mckinley_e9_patchlist = .; 391da177e4SLinus Torvalds 40e55645ecSLuis R. Rodriguez __start_gate_vtop_patchlist = .; 41dafb9320SDenys Vlasenko *(.data..patch.vtop) 42e55645ecSLuis R. Rodriguez __end_gate_vtop_patchlist = .; 431da177e4SLinus Torvalds 44e55645ecSLuis R. Rodriguez __start_gate_fsyscall_patchlist = .; 45dafb9320SDenys Vlasenko *(.data..patch.fsyscall_table) 46e55645ecSLuis R. Rodriguez __end_gate_fsyscall_patchlist = .; 471da177e4SLinus Torvalds 48e55645ecSLuis R. Rodriguez __start_gate_brl_fsys_bubble_down_patchlist = .; 49dafb9320SDenys Vlasenko *(.data..patch.brl_fsys_bubble_down) 50e55645ecSLuis R. Rodriguez __end_gate_brl_fsys_bubble_down_patchlist = .; 511da177e4SLinus Torvalds } :readable 521a43be74SRoland McGrath 531da177e4SLinus Torvalds .IA_64.unwind_info : { *(.IA_64.unwind_info*) } 541da177e4SLinus Torvalds .IA_64.unwind : { *(.IA_64.unwind*) } :readable :unwind 551da177e4SLinus Torvalds#ifdef HAVE_BUGGY_SEGREL 561da177e4SLinus Torvalds .text (GATE_ADDR + PAGE_SIZE) : { *(.text) *(.text.*) } :readable 571da177e4SLinus Torvalds#else 581da177e4SLinus Torvalds . = ALIGN(PERCPU_PAGE_SIZE) + (. & (PERCPU_PAGE_SIZE - 1)); 591da177e4SLinus Torvalds .text : { *(.text) *(.text.*) } :epc 601da177e4SLinus Torvalds#endif 611da177e4SLinus Torvalds 621da177e4SLinus Torvalds /DISCARD/ : { 631da177e4SLinus Torvalds *(.got.plt) *(.got) 641da177e4SLinus Torvalds *(.data .data.* .gnu.linkonce.d.*) 651da177e4SLinus Torvalds *(.dynbss) 661da177e4SLinus Torvalds *(.bss .bss.* .gnu.linkonce.b.*) 671da177e4SLinus Torvalds *(__ex_table) 683283a67dSJes Sorensen *(__mca_table) 691da177e4SLinus Torvalds } 701da177e4SLinus Torvalds} 711da177e4SLinus Torvalds 721da177e4SLinus Torvalds/* 731a43be74SRoland McGrath * ld does not recognize this name token; use the constant. 741a43be74SRoland McGrath */ 751a43be74SRoland McGrath#define PT_IA_64_UNWIND 0x70000001 761a43be74SRoland McGrath 771a43be74SRoland McGrath/* 781da177e4SLinus Torvalds * We must supply the ELF program headers explicitly to get just one 791da177e4SLinus Torvalds * PT_LOAD segment, and set the flags explicitly to make segments read-only. 801da177e4SLinus Torvalds */ 811da177e4SLinus TorvaldsPHDRS 821da177e4SLinus Torvalds{ 831da177e4SLinus Torvalds readable PT_LOAD FILEHDR PHDRS FLAGS(4); /* PF_R */ 841da177e4SLinus Torvalds#ifndef HAVE_BUGGY_SEGREL 851da177e4SLinus Torvalds epc PT_LOAD FILEHDR PHDRS FLAGS(1); /* PF_X */ 861da177e4SLinus Torvalds#endif 871da177e4SLinus Torvalds dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ 88172c5106SRoland McGrath note PT_NOTE FLAGS(4); /* PF_R */ 891a43be74SRoland McGrath unwind PT_IA_64_UNWIND; 901da177e4SLinus Torvalds} 911da177e4SLinus Torvalds 921da177e4SLinus Torvalds/* 931da177e4SLinus Torvalds * This controls what symbols we export from the DSO. 941da177e4SLinus Torvalds */ 951da177e4SLinus TorvaldsVERSION 961da177e4SLinus Torvalds{ 971da177e4SLinus Torvalds LINUX_2.5 { 981da177e4SLinus Torvalds global: 991da177e4SLinus Torvalds __kernel_syscall_via_break; 1001da177e4SLinus Torvalds __kernel_syscall_via_epc; 1011da177e4SLinus Torvalds __kernel_sigtramp; 1021da177e4SLinus Torvalds 1031da177e4SLinus Torvalds local: *; 1041da177e4SLinus Torvalds }; 1051da177e4SLinus Torvalds} 1061da177e4SLinus Torvalds 1071da177e4SLinus Torvalds/* The ELF entry point can be used to set the AT_SYSINFO value. */ 1081da177e4SLinus TorvaldsENTRY(__kernel_syscall_via_epc) 109