Fix alignments in demo/linker.ld

Without this change, when `.data` section size wasn't multiple
of word size, `data_loop` in crt0 was jumping over `_edata` and
continued looping. As it works on words and right now 64 bit CPUs
are biggest ones supported - alignment is now 8 bytes.

Also removed `- 4` from stack address, as it needs to be aligned
to 16 bytes on RISC-V.
This commit is contained in:
Michal Sieron 2021-08-18 18:25:22 +02:00
parent 78c1751c47
commit 92fd154b28
1 changed files with 7 additions and 5 deletions

View File

@ -16,27 +16,29 @@ SECTIONS
.rodata : .rodata :
{ {
. = ALIGN(4); . = ALIGN(8);
_frodata = .; _frodata = .;
*(.rodata .rodata.* .gnu.linkonce.r.*) *(.rodata .rodata.* .gnu.linkonce.r.*)
*(.rodata1) *(.rodata1)
. = ALIGN(8);
_erodata = .; _erodata = .;
} > main_ram } > main_ram
.data : .data :
{ {
. = ALIGN(4); . = ALIGN(8);
_fdata = .; _fdata = .;
*(.data .data.* .gnu.linkonce.d.*) *(.data .data.* .gnu.linkonce.d.*)
*(.data1) *(.data1)
_gp = ALIGN(16); _gp = ALIGN(16);
*(.sdata .sdata.* .gnu.linkonce.s.*) *(.sdata .sdata.* .gnu.linkonce.s.*)
. = ALIGN(8);
_edata = .; _edata = .;
} > main_ram } > main_ram
.bss : .bss :
{ {
. = ALIGN(4); . = ALIGN(8);
_fbss = .; _fbss = .;
*(.dynsbss) *(.dynsbss)
*(.sbss .sbss.* .gnu.linkonce.sb.*) *(.sbss .sbss.* .gnu.linkonce.sb.*)
@ -44,13 +46,13 @@ SECTIONS
*(.dynbss) *(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*) *(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON) *(COMMON)
. = ALIGN(4); . = ALIGN(8);
_ebss = .; _ebss = .;
_end = .; _end = .;
} > sram } > sram
} }
PROVIDE(_fstack = ORIGIN(sram) + LENGTH(sram) - 4); PROVIDE(_fstack = ORIGIN(sram) + LENGTH(sram));
PROVIDE(_fdata_rom = LOADADDR(.data)); PROVIDE(_fdata_rom = LOADADDR(.data));
PROVIDE(_edata_rom = LOADADDR(.data) + SIZEOF(.data)); PROVIDE(_edata_rom = LOADADDR(.data) + SIZEOF(.data));