1/* SPDX-License-Identifier: GPL-2.0 */ 2#include <asm-generic/vmlinux.lds.h> 3#include <asm/page.h> 4 5OUTPUT_FORMAT(ELF_FORMAT) 6OUTPUT_ARCH(ELF_ARCH) 7ENTRY(_start) 8jiffies = jiffies_64; 9 10SECTIONS 11{ 12 PROVIDE (__executable_start = START); 13 . = START + SIZEOF_HEADERS; 14 .interp : { *(.interp) } 15 __binary_start = .; 16 . = ALIGN(4096); /* Init code and data */ 17 _text = .; 18 INIT_TEXT_SECTION(PAGE_SIZE) 19 20 . = ALIGN(PAGE_SIZE); 21 22 /* Read-only sections, merged into text segment: */ 23 .hash : { *(.hash) } 24 .gnu.hash : { *(.gnu.hash) } 25 .dynsym : { *(.dynsym) } 26 .dynstr : { *(.dynstr) } 27 .gnu.version : { *(.gnu.version) } 28 .gnu.version_d : { *(.gnu.version_d) } 29 .gnu.version_r : { *(.gnu.version_r) } 30 .rel.init : { *(.rel.init) } 31 .rela.init : { *(.rela.init) } 32 .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } 33 .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } 34 .rel.fini : { *(.rel.fini) } 35 .rela.fini : { *(.rela.fini) } 36 .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } 37 .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } 38 .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } 39 .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } 40 .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } 41 .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } 42 .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } 43 .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } 44 .rel.ctors : { *(.rel.ctors) } 45 .rela.ctors : { *(.rela.ctors) } 46 .rel.dtors : { *(.rel.dtors) } 47 .rela.dtors : { *(.rela.dtors) } 48 .rel.got : { *(.rel.got) } 49 .rela.got : { *(.rela.got) } 50 .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } 51 .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } 52 .rel.plt : { 53 *(.rel.plt) 54 PROVIDE_HIDDEN(__rel_iplt_start = .); 55 *(.rel.iplt) 56 PROVIDE_HIDDEN(__rel_iplt_end = .); 57 } 58 .rela.plt : { 59 *(.rela.plt) 60 PROVIDE_HIDDEN(__rela_iplt_start = .); 61 *(.rela.iplt) 62 PROVIDE_HIDDEN(__rela_iplt_end = .); 63 } 64 .init : { 65 KEEP (*(.init)) 66 } =0x90909090 67 .plt : { *(.plt) } 68 .text : { 69 _stext = .; 70 TEXT_TEXT 71 SCHED_TEXT 72 CPUIDLE_TEXT 73 LOCK_TEXT 74 *(.fixup) 75 *(.stub .text.* .gnu.linkonce.t.*) 76 /* .gnu.warning sections are handled specially by elf32.em. */ 77 *(.gnu.warning) 78 79 . = ALIGN(PAGE_SIZE); 80 } =0x90909090 81 . = ALIGN(PAGE_SIZE); 82 .syscall_stub : { 83 __syscall_stub_start = .; 84 *(.__syscall_stub*) 85 __syscall_stub_end = .; 86 } 87 .fini : { 88 KEEP (*(.fini)) 89 } =0x90909090 90 91 .kstrtab : { *(.kstrtab) } 92 93 #include <asm/common.lds.S> 94 95 __init_begin = .; 96 init.data : { INIT_DATA } 97 __init_end = .; 98 99 /* Ensure the __preinit_array_start label is properly aligned. We 100 could instead move the label definition inside the section, but 101 the linker would then create the section even if it turns out to 102 be empty, which isn't pretty. */ 103 . = ALIGN(32 / 8); 104 .preinit_array : { *(.preinit_array) } 105 .init_array : { *(.init_array) } 106 .fini_array : { *(.fini_array) } 107 .data : { 108 INIT_TASK_DATA(KERNEL_STACK_SIZE) 109 . = ALIGN(KERNEL_STACK_SIZE); 110 *(.data..init_irqstack) 111 DATA_DATA 112 *(.data.* .gnu.linkonce.d.*) 113 SORT(CONSTRUCTORS) 114 } 115 .data1 : { *(.data1) } 116 .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } 117 .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } 118 .eh_frame : { KEEP (*(.eh_frame)) } 119 .gcc_except_table : { *(.gcc_except_table) } 120 .dynamic : { *(.dynamic) } 121 .ctors : { 122 /* gcc uses crtbegin.o to find the start of 123 the constructors, so we make sure it is 124 first. Because this is a wildcard, it 125 doesn't matter if the user does not 126 actually link against crtbegin.o; the 127 linker won't look for a file to match a 128 wildcard. The wildcard also means that it 129 doesn't matter which directory crtbegin.o 130 is in. */ 131 KEEP (*crtbegin.o(.ctors)) 132 /* We don't want to include the .ctor section from 133 from the crtend.o file until after the sorted ctors. 134 The .ctor section from the crtend file contains the 135 end of ctors marker and it must be last */ 136 KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) 137 KEEP (*(SORT(.ctors.*))) 138 KEEP (*(.ctors)) 139 } 140 .dtors : { 141 KEEP (*crtbegin.o(.dtors)) 142 KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) 143 KEEP (*(SORT(.dtors.*))) 144 KEEP (*(.dtors)) 145 } 146 .jcr : { KEEP (*(.jcr)) } 147 .got : { *(.got.plt) *(.got) } 148 _edata = .; 149 PROVIDE (edata = .); 150 .bss : { 151 __bss_start = .; 152 *(.dynbss) 153 *(.bss .bss.* .gnu.linkonce.b.*) 154 *(COMMON) 155 /* Align here to ensure that the .bss section occupies space up to 156 _end. Align after .bss to ensure correct alignment even if the 157 .bss section disappears because there are no input sections. */ 158 . = ALIGN(32 / 8); 159 . = ALIGN(32 / 8); 160 } 161 __bss_stop = .; 162 _end = .; 163 PROVIDE (end = .); 164 165 STABS_DEBUG 166 167 DWARF_DEBUG 168 169 DISCARDS 170} 171