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