1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * Linker script for gate DSO. The gate pages are an ELF shared object 4*4882a593Smuzhiyun * prelinked to its virtual address, with only one read-only segment and 5*4882a593Smuzhiyun * one execute-only segment (both fit in one page). This script controls 6*4882a593Smuzhiyun * its layout. 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun#include <asm/page.h> 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunSECTIONS 12*4882a593Smuzhiyun{ 13*4882a593Smuzhiyun . = GATE_ADDR + SIZEOF_HEADERS; 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun .hash : { *(.hash) } :readable 16*4882a593Smuzhiyun .gnu.hash : { *(.gnu.hash) } 17*4882a593Smuzhiyun .dynsym : { *(.dynsym) } 18*4882a593Smuzhiyun .dynstr : { *(.dynstr) } 19*4882a593Smuzhiyun .gnu.version : { *(.gnu.version) } 20*4882a593Smuzhiyun .gnu.version_d : { *(.gnu.version_d) } 21*4882a593Smuzhiyun .gnu.version_r : { *(.gnu.version_r) } 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun .note : { *(.note*) } :readable :note 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun .dynamic : { *(.dynamic) } :readable :dynamic 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* 28*4882a593Smuzhiyun * This linker script is used both with -r and with -shared. For 29*4882a593Smuzhiyun * the layouts to match, we need to skip more than enough space for 30*4882a593Smuzhiyun * the dynamic symbol table et al. If this amount is insufficient, 31*4882a593Smuzhiyun * ld -shared will barf. Just increase it here. 32*4882a593Smuzhiyun */ 33*4882a593Smuzhiyun . = GATE_ADDR + 0x600; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun .data..patch : { 36*4882a593Smuzhiyun __start_gate_mckinley_e9_patchlist = .; 37*4882a593Smuzhiyun *(.data..patch.mckinley_e9) 38*4882a593Smuzhiyun __end_gate_mckinley_e9_patchlist = .; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun __start_gate_vtop_patchlist = .; 41*4882a593Smuzhiyun *(.data..patch.vtop) 42*4882a593Smuzhiyun __end_gate_vtop_patchlist = .; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun __start_gate_fsyscall_patchlist = .; 45*4882a593Smuzhiyun *(.data..patch.fsyscall_table) 46*4882a593Smuzhiyun __end_gate_fsyscall_patchlist = .; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun __start_gate_brl_fsys_bubble_down_patchlist = .; 49*4882a593Smuzhiyun *(.data..patch.brl_fsys_bubble_down) 50*4882a593Smuzhiyun __end_gate_brl_fsys_bubble_down_patchlist = .; 51*4882a593Smuzhiyun } :readable 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun .IA_64.unwind_info : { *(.IA_64.unwind_info*) } 54*4882a593Smuzhiyun .IA_64.unwind : { *(.IA_64.unwind*) } :readable :unwind 55*4882a593Smuzhiyun#ifdef HAVE_BUGGY_SEGREL 56*4882a593Smuzhiyun .text (GATE_ADDR + PAGE_SIZE) : { *(.text) *(.text.*) } :readable 57*4882a593Smuzhiyun#else 58*4882a593Smuzhiyun . = ALIGN(PERCPU_PAGE_SIZE) + (. & (PERCPU_PAGE_SIZE - 1)); 59*4882a593Smuzhiyun .text : { *(.text) *(.text.*) } :epc 60*4882a593Smuzhiyun#endif 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /DISCARD/ : { 63*4882a593Smuzhiyun *(.got.plt) *(.got) 64*4882a593Smuzhiyun *(.data .data.* .gnu.linkonce.d.*) 65*4882a593Smuzhiyun *(.dynbss) 66*4882a593Smuzhiyun *(.bss .bss.* .gnu.linkonce.b.*) 67*4882a593Smuzhiyun *(__ex_table) 68*4882a593Smuzhiyun *(__mca_table) 69*4882a593Smuzhiyun } 70*4882a593Smuzhiyun} 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun/* 73*4882a593Smuzhiyun * ld does not recognize this name token; use the constant. 74*4882a593Smuzhiyun */ 75*4882a593Smuzhiyun#define PT_IA_64_UNWIND 0x70000001 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun/* 78*4882a593Smuzhiyun * We must supply the ELF program headers explicitly to get just one 79*4882a593Smuzhiyun * PT_LOAD segment, and set the flags explicitly to make segments read-only. 80*4882a593Smuzhiyun */ 81*4882a593SmuzhiyunPHDRS 82*4882a593Smuzhiyun{ 83*4882a593Smuzhiyun readable PT_LOAD FILEHDR PHDRS FLAGS(4); /* PF_R */ 84*4882a593Smuzhiyun#ifndef HAVE_BUGGY_SEGREL 85*4882a593Smuzhiyun epc PT_LOAD FILEHDR PHDRS FLAGS(1); /* PF_X */ 86*4882a593Smuzhiyun#endif 87*4882a593Smuzhiyun dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ 88*4882a593Smuzhiyun note PT_NOTE FLAGS(4); /* PF_R */ 89*4882a593Smuzhiyun unwind PT_IA_64_UNWIND; 90*4882a593Smuzhiyun} 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun/* 93*4882a593Smuzhiyun * This controls what symbols we export from the DSO. 94*4882a593Smuzhiyun */ 95*4882a593SmuzhiyunVERSION 96*4882a593Smuzhiyun{ 97*4882a593Smuzhiyun LINUX_2.5 { 98*4882a593Smuzhiyun global: 99*4882a593Smuzhiyun __kernel_syscall_via_break; 100*4882a593Smuzhiyun __kernel_syscall_via_epc; 101*4882a593Smuzhiyun __kernel_sigtramp; 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun local: *; 104*4882a593Smuzhiyun }; 105*4882a593Smuzhiyun} 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun/* The ELF entry point can be used to set the AT_SYSINFO value. */ 108*4882a593SmuzhiyunENTRY(__kernel_syscall_via_epc) 109