10500871fSDavid Howells#include <asm/vmlinux.lds.h> 2a7dfa940SCyrill Gorcunov#include <asm/page.h> 31da177e4SLinus Torvalds 41da177e4SLinus TorvaldsOUTPUT_FORMAT(ELF_FORMAT) 51da177e4SLinus TorvaldsOUTPUT_ARCH(ELF_ARCH) 61da177e4SLinus TorvaldsENTRY(_start) 71da177e4SLinus Torvaldsjiffies = jiffies_64; 81da177e4SLinus Torvalds 9d5027ca6SJohannes BergVERSION { 10d5027ca6SJohannes Berg { 11d5027ca6SJohannes Berg local: *; 12d5027ca6SJohannes Berg }; 13d5027ca6SJohannes Berg} 14d5027ca6SJohannes Berg 151da177e4SLinus TorvaldsSECTIONS 161da177e4SLinus Torvalds{ 171da177e4SLinus Torvalds PROVIDE (__executable_start = START); 181da177e4SLinus Torvalds . = START + SIZEOF_HEADERS; 191da177e4SLinus Torvalds .interp : { *(.interp) } 201da177e4SLinus Torvalds __binary_start = .; 211da177e4SLinus Torvalds . = ALIGN(4096); /* Init code and data */ 22d1480c56SJeff Dike _text = .; 235d150a97STim Abbott INIT_TEXT_SECTION(PAGE_SIZE) 241da177e4SLinus Torvalds 25a7dfa940SCyrill Gorcunov . = ALIGN(PAGE_SIZE); 261da177e4SLinus Torvalds 271da177e4SLinus Torvalds /* Read-only sections, merged into text segment: */ 281da177e4SLinus Torvalds .hash : { *(.hash) } 290b0bf7a3SRoland McGrath .gnu.hash : { *(.gnu.hash) } 301da177e4SLinus Torvalds .dynsym : { *(.dynsym) } 311da177e4SLinus Torvalds .dynstr : { *(.dynstr) } 321da177e4SLinus Torvalds .gnu.version : { *(.gnu.version) } 331da177e4SLinus Torvalds .gnu.version_d : { *(.gnu.version_d) } 341da177e4SLinus Torvalds .gnu.version_r : { *(.gnu.version_r) } 351da177e4SLinus Torvalds .rel.init : { *(.rel.init) } 361da177e4SLinus Torvalds .rela.init : { *(.rela.init) } 371da177e4SLinus Torvalds .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } 381da177e4SLinus Torvalds .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } 391da177e4SLinus Torvalds .rel.fini : { *(.rel.fini) } 401da177e4SLinus Torvalds .rela.fini : { *(.rela.fini) } 411da177e4SLinus Torvalds .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } 421da177e4SLinus Torvalds .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } 431da177e4SLinus Torvalds .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } 441da177e4SLinus Torvalds .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } 451da177e4SLinus Torvalds .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } 461da177e4SLinus Torvalds .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } 471da177e4SLinus Torvalds .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } 481da177e4SLinus Torvalds .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } 491da177e4SLinus Torvalds .rel.ctors : { *(.rel.ctors) } 501da177e4SLinus Torvalds .rela.ctors : { *(.rela.ctors) } 511da177e4SLinus Torvalds .rel.dtors : { *(.rel.dtors) } 521da177e4SLinus Torvalds .rela.dtors : { *(.rela.dtors) } 531da177e4SLinus Torvalds .rel.got : { *(.rel.got) } 541da177e4SLinus Torvalds .rela.got : { *(.rela.got) } 551da177e4SLinus Torvalds .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } 561da177e4SLinus Torvalds .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } 57aa5fb4dbSRoland McGrath .rel.plt : { 58aa5fb4dbSRoland McGrath *(.rel.plt) 59aa5fb4dbSRoland McGrath PROVIDE_HIDDEN(__rel_iplt_start = .); 60aa5fb4dbSRoland McGrath *(.rel.iplt) 61aa5fb4dbSRoland McGrath PROVIDE_HIDDEN(__rel_iplt_end = .); 62aa5fb4dbSRoland McGrath } 63aa5fb4dbSRoland McGrath .rela.plt : { 64aa5fb4dbSRoland McGrath *(.rela.plt) 65aa5fb4dbSRoland McGrath PROVIDE_HIDDEN(__rela_iplt_start = .); 66aa5fb4dbSRoland McGrath *(.rela.iplt) 67aa5fb4dbSRoland McGrath PROVIDE_HIDDEN(__rela_iplt_end = .); 68aa5fb4dbSRoland McGrath } 691da177e4SLinus Torvalds .init : { 701da177e4SLinus Torvalds KEEP (*(.init)) 711da177e4SLinus Torvalds } =0x90909090 721da177e4SLinus Torvalds .plt : { *(.plt) } 731da177e4SLinus Torvalds .text : { 74a214a8c6SJiang Liu _stext = .; 757664709bSSam Ravnborg TEXT_TEXT 761da177e4SLinus Torvalds SCHED_TEXT 771da177e4SLinus Torvalds LOCK_TEXT 78324f80ccSJohannes Berg IRQENTRY_TEXT 79324f80ccSJohannes Berg SOFTIRQENTRY_TEXT 801da177e4SLinus Torvalds *(.fixup) 811da177e4SLinus Torvalds *(.stub .text.* .gnu.linkonce.t.*) 821da177e4SLinus Torvalds /* .gnu.warning sections are handled specially by elf32.em. */ 831da177e4SLinus Torvalds *(.gnu.warning) 84d67b569fSJeff Dike 85a7dfa940SCyrill Gorcunov . = ALIGN(PAGE_SIZE); 86c7ec16daSJeff Dike } =0x90909090 87a7dfa940SCyrill Gorcunov . = ALIGN(PAGE_SIZE); 88c7ec16daSJeff Dike .syscall_stub : { 89d67b569fSJeff Dike __syscall_stub_start = .; 90d67b569fSJeff Dike *(.__syscall_stub*) 91d67b569fSJeff Dike __syscall_stub_end = .; 92c7ec16daSJeff Dike } 931da177e4SLinus Torvalds .fini : { 941da177e4SLinus Torvalds KEEP (*(.fini)) 951da177e4SLinus Torvalds } =0x90909090 961da177e4SLinus Torvalds 971da177e4SLinus Torvalds .kstrtab : { *(.kstrtab) } 981da177e4SLinus Torvalds 9937185b33SAl Viro #include <asm/common.lds.S> 1001da177e4SLinus Torvalds 101a214a8c6SJiang Liu __init_begin = .; 10201ba2bdcSSam Ravnborg init.data : { INIT_DATA } 103a214a8c6SJiang Liu __init_end = .; 1041da177e4SLinus Torvalds 1051da177e4SLinus Torvalds /* Ensure the __preinit_array_start label is properly aligned. We 1061da177e4SLinus Torvalds could instead move the label definition inside the section, but 1071da177e4SLinus Torvalds the linker would then create the section even if it turns out to 1081da177e4SLinus Torvalds be empty, which isn't pretty. */ 1091da177e4SLinus Torvalds . = ALIGN(32 / 8); 1101da177e4SLinus Torvalds .preinit_array : { *(.preinit_array) } 111*5b301409SPatricia Alfonso .init_array : { 112*5b301409SPatricia Alfonso *(.kasan_init) 113*5b301409SPatricia Alfonso *(.init_array.*) 114*5b301409SPatricia Alfonso *(.init_array) 115*5b301409SPatricia Alfonso } 1161da177e4SLinus Torvalds .fini_array : { *(.fini_array) } 1171da177e4SLinus Torvalds .data : { 1185d150a97STim Abbott INIT_TASK_DATA(KERNEL_STACK_SIZE) 119c14b8494SJeff Dike . = ALIGN(KERNEL_STACK_SIZE); 1209d1578a3SDenys Vlasenko *(.data..init_irqstack) 121ca967258SSam Ravnborg DATA_DATA 122ca967258SSam Ravnborg *(.data.* .gnu.linkonce.d.*) 1231da177e4SLinus Torvalds SORT(CONSTRUCTORS) 1241da177e4SLinus Torvalds } 1251da177e4SLinus Torvalds .data1 : { *(.data1) } 1261da177e4SLinus Torvalds .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } 1271da177e4SLinus Torvalds .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } 1281da177e4SLinus Torvalds .eh_frame : { KEEP (*(.eh_frame)) } 1291da177e4SLinus Torvalds .gcc_except_table : { *(.gcc_except_table) } 1301da177e4SLinus Torvalds .dynamic : { *(.dynamic) } 1311da177e4SLinus Torvalds .ctors : { 1321da177e4SLinus Torvalds /* gcc uses crtbegin.o to find the start of 1331da177e4SLinus Torvalds the constructors, so we make sure it is 1341da177e4SLinus Torvalds first. Because this is a wildcard, it 1351da177e4SLinus Torvalds doesn't matter if the user does not 1361da177e4SLinus Torvalds actually link against crtbegin.o; the 1371da177e4SLinus Torvalds linker won't look for a file to match a 1381da177e4SLinus Torvalds wildcard. The wildcard also means that it 1391da177e4SLinus Torvalds doesn't matter which directory crtbegin.o 1401da177e4SLinus Torvalds is in. */ 1411da177e4SLinus Torvalds KEEP (*crtbegin.o(.ctors)) 1421da177e4SLinus Torvalds /* We don't want to include the .ctor section from 1431da177e4SLinus Torvalds from the crtend.o file until after the sorted ctors. 1441da177e4SLinus Torvalds The .ctor section from the crtend file contains the 1451da177e4SLinus Torvalds end of ctors marker and it must be last */ 1461da177e4SLinus Torvalds KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) 1471da177e4SLinus Torvalds KEEP (*(SORT(.ctors.*))) 1481da177e4SLinus Torvalds KEEP (*(.ctors)) 1491da177e4SLinus Torvalds } 1501da177e4SLinus Torvalds .dtors : { 1511da177e4SLinus Torvalds KEEP (*crtbegin.o(.dtors)) 1521da177e4SLinus Torvalds KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) 1531da177e4SLinus Torvalds KEEP (*(SORT(.dtors.*))) 1541da177e4SLinus Torvalds KEEP (*(.dtors)) 1551da177e4SLinus Torvalds } 1561da177e4SLinus Torvalds .jcr : { KEEP (*(.jcr)) } 1571da177e4SLinus Torvalds .got : { *(.got.plt) *(.got) } 1581da177e4SLinus Torvalds _edata = .; 1591da177e4SLinus Torvalds PROVIDE (edata = .); 1601da177e4SLinus Torvalds .bss : { 161c7ec16daSJeff Dike __bss_start = .; 1621da177e4SLinus Torvalds *(.dynbss) 1631da177e4SLinus Torvalds *(.bss .bss.* .gnu.linkonce.b.*) 1641da177e4SLinus Torvalds *(COMMON) 1651da177e4SLinus Torvalds /* Align here to ensure that the .bss section occupies space up to 1661da177e4SLinus Torvalds _end. Align after .bss to ensure correct alignment even if the 1671da177e4SLinus Torvalds .bss section disappears because there are no input sections. */ 1681da177e4SLinus Torvalds . = ALIGN(32 / 8); 1691da177e4SLinus Torvalds . = ALIGN(32 / 8); 1701da177e4SLinus Torvalds } 171a214a8c6SJiang Liu __bss_stop = .; 1721da177e4SLinus Torvalds _end = .; 1731da177e4SLinus Torvalds PROVIDE (end = .); 174a7d0c210SPaolo 'Blaisorblade' Giarrusso 175a7d0c210SPaolo 'Blaisorblade' Giarrusso STABS_DEBUG 176a7d0c210SPaolo 'Blaisorblade' Giarrusso DWARF_DEBUG 177c604abc3SKees Cook ELF_DETAILS 178405d967dSTejun Heo 179023bf6f1STejun Heo DISCARDS 1801da177e4SLinus Torvalds} 181