diff --git a/litex/soc/software/demo/linker.ld b/litex/soc/software/demo/linker.ld index 36af68283..d95d86286 100644 --- a/litex/soc/software/demo/linker.ld +++ b/litex/soc/software/demo/linker.ld @@ -10,33 +10,41 @@ SECTIONS .text : { _ftext = .; + /* Make sure crt0 files come first, and they, and the isr */ + /* don't get disposed of by greedy optimisation */ + *crt0*(.text) + KEEP(*crt0*(.text)) + KEEP(*(.text.isr)) + *(.text .stub .text.* .gnu.linkonce.t.*) _etext = .; } > main_ram .rodata : { - . = ALIGN(4); + . = ALIGN(8); _frodata = .; *(.rodata .rodata.* .gnu.linkonce.r.*) *(.rodata1) + . = ALIGN(8); _erodata = .; } > main_ram .data : { - . = ALIGN(4); + . = ALIGN(8); _fdata = .; *(.data .data.* .gnu.linkonce.d.*) *(.data1) _gp = ALIGN(16); *(.sdata .sdata.* .gnu.linkonce.s.*) + . = ALIGN(8); _edata = .; } > main_ram .bss : { - . = ALIGN(4); + . = ALIGN(8); _fbss = .; *(.dynsbss) *(.sbss .sbss.* .gnu.linkonce.sb.*) @@ -44,13 +52,13 @@ SECTIONS *(.dynbss) *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) - . = ALIGN(4); + . = ALIGN(8); _ebss = .; _end = .; } > sram } -PROVIDE(_fstack = ORIGIN(sram) + LENGTH(sram) - 4); +PROVIDE(_fstack = ORIGIN(sram) + LENGTH(sram)); PROVIDE(_fdata_rom = LOADADDR(.data)); PROVIDE(_edata_rom = LOADADDR(.data) + SIZEOF(.data));