xref: /linux/arch/um/kernel/dyn.lds.S (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
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