|
@@ -18,13 +18,13 @@ MEMORY
|
|
|
|
|
|
SECTIONS
|
|
SECTIONS
|
|
{
|
|
{
|
|
- /*
|
|
|
|
|
|
+ /*
|
|
* Sections we do not need. This program cannot exit, so
|
|
* Sections we do not need. This program cannot exit, so
|
|
* fini/destructors are never needed. Exception handling
|
|
* fini/destructors are never needed. Exception handling
|
|
* is not supported.
|
|
* is not supported.
|
|
*/
|
|
*/
|
|
/DISCARD/ : {
|
|
/DISCARD/ : {
|
|
- *(.note.GNU-stack)
|
|
|
|
|
|
+ *(.note.GNU-stack)
|
|
*(.gnu_debuglink)
|
|
*(.gnu_debuglink)
|
|
*(.gnu.lto_*)
|
|
*(.gnu.lto_*)
|
|
*(.discard)
|
|
*(.discard)
|
|
@@ -53,42 +53,64 @@ SECTIONS
|
|
KEEP (*(SORT_NONE(.init.irq)))
|
|
KEEP (*(SORT_NONE(.init.irq)))
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Put the short data sections in the zero page.
|
|
|
|
+ * This means .bss and .sbss aren't contiguous, but
|
|
|
|
+ * all memory is intialized during FPGA load anyway.
|
|
|
|
+ */
|
|
|
|
+ .sdata : ALIGN(4) {
|
|
|
|
+ __SDATA_BEGIN__ = .;
|
|
|
|
+ *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4)
|
|
|
|
+ *(.srodata.cst2) *(.srodata .srodata.*)
|
|
|
|
+ *(.sdata .sdata.* .gnu.linkonce.s.*)
|
|
|
|
+ }
|
|
|
|
+ .sbss : ALIGN(4) {
|
|
|
|
+ *(.dynsbss)
|
|
|
|
+ *(.sbss .sbss.* .gnu.linkonce.sb.*)
|
|
|
|
+ *(.scommon)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $assert_zero_page = ASSERT((. <= 2048), "zero page overflow");
|
|
|
|
+
|
|
|
|
+ __global_pointer$ = 0;
|
|
|
|
+
|
|
.text : ALIGN(4) {
|
|
.text : ALIGN(4) {
|
|
|
|
+ PROVIDE(___text = .);
|
|
KEEP (*(SORT_NONE(.init)))
|
|
KEEP (*(SORT_NONE(.init)))
|
|
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
|
|
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
|
|
*(.text.exit .text.exit.*)
|
|
*(.text.exit .text.exit.*)
|
|
- *(.text.startup .text.startup.*)
|
|
|
|
- *(.text.hot .text.hot.*)
|
|
|
|
- *(SORT(.text.sorted.*))
|
|
|
|
- *(.text .stub .text.* .gnu.linkonce.t.*)
|
|
|
|
- /* .gnu.warning sections are handled specially by elf.em. */
|
|
|
|
- *(.gnu.warning)
|
|
|
|
|
|
+ *(.text.startup .text.startup.*)
|
|
|
|
+ *(.text.hot .text.hot.*)
|
|
|
|
+ *(SORT(.text.sorted.*))
|
|
|
|
+ *(.text .stub .text.* .gnu.linkonce.t.*)
|
|
|
|
+ /* .gnu.warning sections are handled specially by elf.em. */
|
|
|
|
+ *(.gnu.warning)
|
|
}
|
|
}
|
|
|
|
|
|
PROVIDE (__etext = .);
|
|
PROVIDE (__etext = .);
|
|
- PROVIDE (_etext = .);
|
|
|
|
|
|
+ PROVIDE (_etext = .);
|
|
. = ALIGN(4);
|
|
. = ALIGN(4);
|
|
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
|
|
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
|
|
- .rodata1 : { *(.rodata1) }
|
|
|
|
- .sdata2 : {
|
|
|
|
|
|
+ .rodata1 : { *(.rodata1) }
|
|
|
|
+ .sdata2 : {
|
|
*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
|
|
*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
|
|
- }
|
|
|
|
|
|
+ }
|
|
.sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) }
|
|
.sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) }
|
|
|
|
|
|
/* Thread Local Storage sections */
|
|
/* Thread Local Storage sections */
|
|
.tdata : {
|
|
.tdata : {
|
|
- PROVIDE_HIDDEN (__tdata_start = .);
|
|
|
|
|
|
+ PROVIDE_HIDDEN (__tdata_start = .);
|
|
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
|
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
|
}
|
|
}
|
|
- .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
|
|
|
|
- .preinit_array : {
|
|
|
|
|
|
+ .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
|
|
|
|
+ .preinit_array : {
|
|
PROVIDE_HIDDEN (__preinit_array_start = .);
|
|
PROVIDE_HIDDEN (__preinit_array_start = .);
|
|
- KEEP (*(.preinit_array))
|
|
|
|
- PROVIDE_HIDDEN (__preinit_array_end = .);
|
|
|
|
- }
|
|
|
|
- .init_array : {
|
|
|
|
- PROVIDE_HIDDEN (__init_array_start = .);
|
|
|
|
- KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)
|
|
|
|
|
|
+ KEEP (*(.preinit_array))
|
|
|
|
+ PROVIDE_HIDDEN (__preinit_array_end = .);
|
|
|
|
+ }
|
|
|
|
+ .init_array : {
|
|
|
|
+ PROVIDE_HIDDEN (__init_array_start = .);
|
|
|
|
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)
|
|
SORT_BY_INIT_PRIORITY(.ctors.*)))
|
|
SORT_BY_INIT_PRIORITY(.ctors.*)))
|
|
KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
|
|
KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
|
|
PROVIDE_HIDDEN (__init_array_end = .);
|
|
PROVIDE_HIDDEN (__init_array_end = .);
|
|
@@ -106,42 +128,26 @@ SECTIONS
|
|
SORT(CONSTRUCTORS)
|
|
SORT(CONSTRUCTORS)
|
|
}
|
|
}
|
|
.data1 : { *(.data1) }
|
|
.data1 : { *(.data1) }
|
|
- /* We want the small data sections together, so single-instruction offsets
|
|
|
|
- can access them all, and initialized data all before uninitialized, so
|
|
|
|
- we can shorten the on-disk segment size. */
|
|
|
|
- .sdata : {
|
|
|
|
- __SDATA_BEGIN__ = .;
|
|
|
|
- *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4)
|
|
|
|
- *(.srodata.cst2) *(.srodata .srodata.*)
|
|
|
|
- *(.sdata .sdata.* .gnu.linkonce.s.*)
|
|
|
|
- }
|
|
|
|
- _edata = .;
|
|
|
|
|
|
+ _edata = .;
|
|
. = ALIGN(16);
|
|
. = ALIGN(16);
|
|
- __bss_start = .;
|
|
|
|
- .sbss : {
|
|
|
|
- *(.dynsbss)
|
|
|
|
- *(.sbss .sbss.* .gnu.linkonce.sb.*)
|
|
|
|
- *(.scommon)
|
|
|
|
- }
|
|
|
|
|
|
+ __bss_start = .;
|
|
.bss : {
|
|
.bss : {
|
|
*(.dynbss)
|
|
*(.dynbss)
|
|
- *(.bss .bss.* .gnu.linkonce.b.*)
|
|
|
|
- *(COMMON)
|
|
|
|
|
|
+ *(.bss .bss.* .gnu.linkonce.b.*)
|
|
|
|
+ *(COMMON)
|
|
/* Align here to ensure that the .bss section occupies space up to
|
|
/* Align here to ensure that the .bss section occupies space up to
|
|
_end. Align after .bss to ensure correct alignment even if the
|
|
_end. Align after .bss to ensure correct alignment even if the
|
|
.bss section disappears because there are no input sections.
|
|
.bss section disappears because there are no input sections.
|
|
FIXME: Why do we need it? When there is no .bss section, we do not
|
|
FIXME: Why do we need it? When there is no .bss section, we do not
|
|
pad the .data section. */
|
|
pad the .data section. */
|
|
- . = ALIGN(16);
|
|
|
|
|
|
+ . = ALIGN(16);
|
|
}
|
|
}
|
|
- . = SEGMENT_START("ldata-segment", .);
|
|
|
|
- . = ALIGN(16);
|
|
|
|
|
|
+ . = SEGMENT_START("ldata-segment", .);
|
|
|
|
+ . = ALIGN(16);
|
|
__BSS_END__ = .;
|
|
__BSS_END__ = .;
|
|
|
|
+ _end = .;
|
|
|
|
|
|
.stack STACK_BOTTOM : {
|
|
.stack STACK_BOTTOM : {
|
|
KEEP (*(.stack))
|
|
KEEP (*(.stack))
|
|
}
|
|
}
|
|
- __global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800,
|
|
|
|
- MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800));
|
|
|
|
- _end = .;
|
|
|
|
}
|
|
}
|