The textram section must be aligned to 8 bytes to keep the linker
happy. However, if that section contains no data, the declaration will
set the __data_start__ value to that alignment, but the data section
itself would start on a 4-byte alignment, potentially 4 bytes lower
than the value indicated by __data_start__. This completely scrambles
initialized memory as the startup code will copy the data segment to
__data_start__, 4 bytes off of the actual data segment start.
Fix this by forcing the data segment to also be aligned to 8 bytes.
Signed-off-by: Keith Packard <keithp@keithp.com>
MEMORY {
rom (rx) : ORIGIN = 0x08001000, LENGTH = 20K
flash(rx) : ORIGIN = 0x08006000, LENGTH = 8K
MEMORY {
rom (rx) : ORIGIN = 0x08001000, LENGTH = 20K
flash(rx) : ORIGIN = 0x08006000, LENGTH = 8K
- ram (!w) : ORIGIN = 0x20000000, LENGTH = 6k - 128
- stack (!w) : ORIGIN = 0x20000000 + 6k - 128, LENGTH = 128
+ ram (!w) : ORIGIN = 0x20000000, LENGTH = 6k - 512
+ stack (!w) : ORIGIN = 0x20000000 + 6k - 512, LENGTH = 512
*(.ramtext)
} >ram AT>rom
*(.ramtext)
} >ram AT>rom
- /* Data -- relocated to RAM, but written to ROM
+ /* Data -- relocated to RAM, but written to ROM,
+ * also aligned to 8 bytes to agree with textram
*(.data) /* initialized data */
*(.data) /* initialized data */
__data_end__ = .;
} >ram AT>rom
__data_end__ = .;
} >ram AT>rom
} >ram AT>rom
/* Data -- relocated to RAM, but written to ROM
} >ram AT>rom
/* Data -- relocated to RAM, but written to ROM
+ * Also aligned to 8 bytes to agree with textram
*(.data) /* initialized data */
__data_end__ = .;
} >ram AT>rom
*(.data) /* initialized data */
__data_end__ = .;
} >ram AT>rom
__text_ram_end = .;
} >ram AT>rom
__text_ram_end = .;
} >ram AT>rom
- /* Data -- relocated to RAM, but written to ROM
+ /* Data -- relocated to RAM, but written to ROM.
+ * also aligned to 8 bytes in case textram is empty
*(.data) /* initialized data */
__data_end__ = .;
} >ram AT>rom
*(.data) /* initialized data */
__data_end__ = .;
} >ram AT>rom