1 /* SPDX-License-Identifier: GPL-2.0 */ 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Kernel link layout for various "sections !! 2 #include <asm/asm-offsets.h> 3 * !! 3 #include <asm/thread_info.h> 4 * Copyright (C) 1999-2003 Matthew Wilcox < !! 4 5 * Copyright (C) 2000-2003 Paul Bame <bame !! 5 #define PAGE_SIZE _PAGE_SIZE 6 * Copyright (C) 2000 John Marvin <jsm at p << 7 * Copyright (C) 2000 Michael Ang <mang wit << 8 * Copyright (C) 2002 Randolph Chung <tausq << 9 * Copyright (C) 2003 James Bottomley <jejb << 10 * Copyright (C) 2006-2013 Helge Deller <del << 11 */ << 12 6 13 /* 7 /* 14 * Put page table entries (swapper_pg_dir) as !! 8 * Put .bss..swapper_pg_dir as the first thing in .bss. This will 15 * will ensure that it has .bss alignment (PAG !! 9 * ensure that it has .bss alignment (64K). 16 */ 10 */ 17 #define BSS_FIRST_SECTIONS *(.data..vm0.p !! 11 #define BSS_FIRST_SECTIONS *(.bss..swapper_pg_dir) 18 *(.data..vm0.p << 19 *(.data..vm0.p << 20 12 21 #define CC_USING_PATCHABLE_FUNCTION_ENTRY !! 13 /* Cavium Octeon should not have a separate PT_NOTE Program Header. */ 22 #define RO_EXCEPTION_TABLE_ALIGN 8 !! 14 #ifndef CONFIG_CAVIUM_OCTEON_SOC >> 15 #define EMITS_PT_NOTE >> 16 #endif 23 17 24 #include <asm-generic/vmlinux.lds.h> !! 18 #define RUNTIME_DISCARD_EXIT 25 19 26 /* needed for the processor specific cache ali !! 20 #include <asm-generic/vmlinux.lds.h> 27 #include <asm/cache.h> << 28 #include <asm/page.h> << 29 #include <asm/asm-offsets.h> << 30 #include <asm/thread_info.h> << 31 << 32 /* ld script to make hppa Linux kernel */ << 33 #ifndef CONFIG_64BIT << 34 OUTPUT_FORMAT("elf32-hppa-linux") << 35 OUTPUT_ARCH(hppa) << 36 #else << 37 OUTPUT_FORMAT("elf64-hppa-linux") << 38 OUTPUT_ARCH(hppa:hppa2.0w) << 39 #endif << 40 21 41 #define EXIT_TEXT_SECTIONS() .exit.text : { !! 22 #undef mips 42 #if !defined(CONFIG_64BIT) || defined(CONFIG_M !! 23 #define mips mips 43 #define MLONGCALL_KEEP(x) !! 24 OUTPUT_ARCH(mips) 44 #define MLONGCALL_DISCARD(x) x !! 25 ENTRY(kernel_entry) >> 26 PHDRS { >> 27 text PT_LOAD FLAGS(7); /* RWX */ >> 28 #ifndef CONFIG_CAVIUM_OCTEON_SOC >> 29 note PT_NOTE FLAGS(4); /* R__ */ >> 30 #endif /* CAVIUM_OCTEON_SOC */ >> 31 } >> 32 >> 33 #ifdef CONFIG_32BIT >> 34 #ifdef CONFIG_CPU_LITTLE_ENDIAN >> 35 jiffies = jiffies_64; >> 36 #else >> 37 jiffies = jiffies_64 + 4; >> 38 #endif 45 #else 39 #else 46 #define MLONGCALL_KEEP(x) x !! 40 jiffies = jiffies_64; 47 #define MLONGCALL_DISCARD(x) << 48 #endif 41 #endif 49 42 50 ENTRY(parisc_kernel_start) << 51 #ifndef CONFIG_64BIT << 52 jiffies = jiffies_64 + 4; << 53 #else << 54 jiffies = jiffies_64; << 55 #endif << 56 SECTIONS 43 SECTIONS 57 { 44 { 58 . = KERNEL_BINARY_TEXT_START; !! 45 #ifdef CONFIG_BOOT_ELF64 59 !! 46 /* Read-only sections, merged into text segment: */ 60 __init_begin = .; !! 47 /* . = 0xc000000000000000; */ 61 HEAD_TEXT_SECTION !! 48 62 MLONGCALL_DISCARD(INIT_TEXT_SECTION(8) !! 49 /* This is the value for an Origin kernel, taken from an IRIX kernel. */ 63 !! 50 /* . = 0xc00000000001c000; */ 64 . = ALIGN(PAGE_SIZE); !! 51 65 INIT_DATA_SECTION(PAGE_SIZE) !! 52 /* Set the vaddr for the text segment to a value 66 MLONGCALL_DISCARD(EXIT_TEXT_SECTIONS() !! 53 * >= 0xa800 0000 0001 9000 if no symmon is going to configured 67 .exit.data : !! 54 * >= 0xa800 0000 0030 0000 otherwise 68 { !! 55 */ 69 EXIT_DATA << 70 } << 71 PERCPU_SECTION(8) << 72 . = ALIGN(4); << 73 .altinstructions : { << 74 __alt_instructions = .; << 75 *(.altinstructions) << 76 __alt_instructions_end = .; << 77 } << 78 . = ALIGN(HUGEPAGE_SIZE); << 79 __init_end = .; << 80 /* freed after init ends here */ << 81 56 82 _text = .; /* Text and re !! 57 /* . = 0xa800000000300000; */ 83 _stext = .; !! 58 . = 0xffffffff80300000; 84 MLONGCALL_KEEP(INIT_TEXT_SECTION(8)) !! 59 #endif 85 .text ALIGN(PAGE_SIZE) : { !! 60 . = LINKER_LOAD_ADDRESS; >> 61 /* read-only */ >> 62 _text = .; /* Text and read-only data */ >> 63 .text : { 86 TEXT_TEXT 64 TEXT_TEXT 87 LOCK_TEXT << 88 SCHED_TEXT 65 SCHED_TEXT >> 66 LOCK_TEXT 89 KPROBES_TEXT 67 KPROBES_TEXT 90 IRQENTRY_TEXT 68 IRQENTRY_TEXT 91 SOFTIRQENTRY_TEXT 69 SOFTIRQENTRY_TEXT 92 *(.text.do_softirq) << 93 *(.text.sys_exit) << 94 *(.text.do_sigaltstack) << 95 *(.text.do_fork) << 96 *(.text.div) << 97 *($$*) /* mil << 98 *(.text.*) << 99 *(.fixup) 70 *(.fixup) 100 *(.lock.text) /* out << 101 *(.gnu.warning) 71 *(.gnu.warning) >> 72 . = ALIGN(16); >> 73 *(.got) /* Global offset table */ >> 74 } :text = 0 >> 75 _etext = .; /* End of text section */ >> 76 >> 77 EXCEPTION_TABLE(16) >> 78 >> 79 /* Exception table for data bus errors */ >> 80 __dbe_table : { >> 81 __start___dbe_table = .; >> 82 KEEP(*(__dbe_table)) >> 83 __stop___dbe_table = .; 102 } 84 } 103 MLONGCALL_KEEP(EXIT_TEXT_SECTIONS()) !! 85 104 . = ALIGN(PAGE_SIZE); !! 86 _sdata = .; /* Start of data section */ 105 _etext = .; !! 87 RO_DATA(4096) 106 /* End of text section */ !! 88 107 !! 89 /* writeable */ 108 /* Start of data section */ !! 90 .data : { /* Data */ 109 _sdata = .; !! 91 . = . + DATAOFFSET; /* for CONFIG_MAPPED_KERNEL */ 110 !! 92 111 /* Architecturally we need to keep __g !! 93 INIT_TASK_DATA(THREAD_SIZE) 112 * in front of RO_DATA() which stores !! 94 NOSAVE_DATA 113 * and ftrace symbols. */ !! 95 PAGE_ALIGNED_DATA(PAGE_SIZE) 114 #ifdef CONFIG_64BIT !! 96 CACHELINE_ALIGNED_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT) 115 . = ALIGN(16); !! 97 READ_MOSTLY_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT) 116 /* Linkage tables */ !! 98 DATA_DATA 117 .opd : { !! 99 CONSTRUCTORS 118 __start_opd = .; !! 100 } 119 *(.opd) !! 101 BUG_TABLE 120 __end_opd = .; !! 102 _gp = . + 0x8000; 121 } PROVIDE (__gp = .); !! 103 .lit8 : { 122 .plt : { !! 104 *(.lit8) 123 *(.plt) !! 105 } 124 } !! 106 .lit4 : { 125 .dlt : { !! 107 *(.lit4) 126 *(.dlt) !! 108 } >> 109 /* We want the small data sections together, so single-instruction offsets >> 110 can access them all, and initialized data all before uninitialized, so >> 111 we can shorten the on-disk segment size. */ >> 112 .sdata : { >> 113 *(.sdata) 127 } 114 } 128 #endif !! 115 _edata = .; /* End of data section */ 129 116 130 RO_DATA(PAGE_SIZE) !! 117 /* will be freed after init */ >> 118 . = ALIGN(PAGE_SIZE); /* Init code and data */ >> 119 __init_begin = .; >> 120 INIT_TEXT_SECTION(PAGE_SIZE) >> 121 INIT_DATA_SECTION(16) 131 122 132 /* unwind info */ << 133 . = ALIGN(4); 123 . = ALIGN(4); 134 .PARISC.unwind : { !! 124 .mips.machines.init : AT(ADDR(.mips.machines.init) - LOAD_OFFSET) { 135 __start___unwind = .; !! 125 __mips_machines_start = .; 136 *(.PARISC.unwind) !! 126 KEEP(*(.mips.machines.init)) 137 __stop___unwind = .; !! 127 __mips_machines_end = .; 138 } 128 } 139 129 140 /* writeable */ !! 130 /* .exit.text is discarded at runtime, not link time, to deal with 141 /* Make sure this is page aligned so !! 131 * references from .rodata 142 * that we can properly leave these << 143 * as writable << 144 */ 132 */ 145 . = ALIGN(HUGEPAGE_SIZE); !! 133 .exit.text : { 146 data_start = .; !! 134 EXIT_TEXT >> 135 } >> 136 .exit.data : { >> 137 EXIT_DATA >> 138 } >> 139 #ifdef CONFIG_SMP >> 140 PERCPU_SECTION(1 << CONFIG_MIPS_L1_CACHE_SHIFT) >> 141 #endif 147 142 148 /* Data */ !! 143 .rel.dyn : ALIGN(8) { 149 RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, PAG !! 144 *(.rel) >> 145 *(.rel*) >> 146 } 150 147 151 /* PA-RISC locks requires 16-byte alig !! 148 #ifdef CONFIG_MIPS_ELF_APPENDED_DTB 152 . = ALIGN(16); !! 149 STRUCT_ALIGN(); 153 .data..lock_aligned : { !! 150 .appended_dtb : AT(ADDR(.appended_dtb) - LOAD_OFFSET) { 154 *(.data..lock_aligned) !! 151 *(.appended_dtb) >> 152 KEEP(*(.appended_dtb)) 155 } 153 } >> 154 #endif 156 155 157 /* End of data section */ !! 156 #ifdef CONFIG_RELOCATABLE 158 . = ALIGN(PAGE_SIZE); !! 157 . = ALIGN(4); 159 _edata = .; << 160 158 161 /* BSS */ !! 159 .data.reloc : { 162 BSS_SECTION(PAGE_SIZE, PAGE_SIZE, PAGE !! 160 _relocation_start = .; >> 161 /* >> 162 * Space for relocation table >> 163 * This needs to be filled so that the >> 164 * relocs tool can overwrite the content. >> 165 * An invalid value is left at the start of the >> 166 * section to abort relocation if the table >> 167 * has not been filled in. >> 168 */ >> 169 LONG(0xFFFFFFFF); >> 170 FILL(0); >> 171 . += CONFIG_RELOCATION_TABLE_SIZE - 4; >> 172 _relocation_end = .; >> 173 } >> 174 #endif >> 175 >> 176 #ifdef CONFIG_MIPS_RAW_APPENDED_DTB >> 177 .fill : { >> 178 FILL(0); >> 179 BYTE(0); >> 180 STRUCT_ALIGN(); >> 181 } >> 182 __appended_dtb = .; >> 183 /* leave space for appended DTB */ >> 184 . += 0x100000; >> 185 #endif >> 186 /* >> 187 * Align to 64K in attempt to eliminate holes before the >> 188 * .bss..swapper_pg_dir section at the start of .bss. This >> 189 * also satisfies PAGE_SIZE alignment as the largest page size >> 190 * allowed is 64K. >> 191 */ >> 192 . = ALIGN(0x10000); >> 193 __init_end = .; >> 194 /* freed after init ends here */ >> 195 >> 196 /* >> 197 * Force .bss to 64K alignment so that .bss..swapper_pg_dir >> 198 * gets that alignment. .sbss should be empty, so there will be >> 199 * no holes after __init_end. */ >> 200 BSS_SECTION(0, 0x10000, 8) 163 201 164 . = ALIGN(HUGEPAGE_SIZE); << 165 _end = . ; 202 _end = . ; 166 203 >> 204 /* These mark the ABI of the kernel for debuggers. */ >> 205 .mdebug.abi32 : { >> 206 KEEP(*(.mdebug.abi32)) >> 207 } >> 208 .mdebug.abi64 : { >> 209 KEEP(*(.mdebug.abi64)) >> 210 } >> 211 >> 212 /* This is the MIPS specific mdebug section. */ >> 213 .mdebug : { >> 214 *(.mdebug) >> 215 } >> 216 167 STABS_DEBUG 217 STABS_DEBUG >> 218 DWARF_DEBUG 168 ELF_DETAILS 219 ELF_DETAILS 169 .note 0 : { *(.note) } !! 220 >> 221 /* These must appear regardless of . */ >> 222 .gptab.sdata : { >> 223 *(.gptab.data) >> 224 *(.gptab.sdata) >> 225 } >> 226 .gptab.sbss : { >> 227 *(.gptab.bss) >> 228 *(.gptab.sbss) >> 229 } 170 230 171 /* Sections to be discarded */ 231 /* Sections to be discarded */ 172 DISCARDS 232 DISCARDS 173 /DISCARD/ : { 233 /DISCARD/ : { 174 #ifdef CONFIG_64BIT !! 234 /* ABI crap starts here */ 175 /* temporary hack until binuti !! 235 *(.MIPS.abiflags) 176 * for static binaries !! 236 *(.MIPS.options) 177 */ !! 237 *(.gnu.attributes) 178 *(.interp) !! 238 *(.options) 179 *(.dynsym) !! 239 *(.pdr) 180 *(.dynstr) !! 240 *(.reginfo) 181 *(.dynamic) << 182 *(.hash) << 183 *(.gnu.hash) << 184 #endif << 185 } 241 } 186 } 242 }
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.