*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
*/
MEMORY {
- rom (rx) : ORIGIN = 0x08000000, LENGTH = 128K
- ram (!w) : ORIGIN = 0x20000000, LENGTH = 16K
+ rom (rx) : ORIGIN = 0x08001000, LENGTH = 124K
+ ram (!w) : ORIGIN = 0x20000000, LENGTH = 15872
+ stack (!w) : ORIGIN = 0x20003e00, LENGTH = 512
}
INCLUDE registers.ld
EXTERN (stm_interrupt_vector)
-C_STACK_SIZE = 512;
SECTIONS {
- . = ORIGIN(rom);
-
/*
* Rom contents
*/
- __text_start__ = .;
-
- .text : {
+ .text ORIGIN(rom) : {
+ __text_start__ = .;
*(.interrupt) /* Interrupt vectors */
- *(.text) /* Executable code */
- *(.rodata) /* Constants */
+
+ . = ORIGIN(rom) + 0x100;
+
+
+ /* Ick. What I want is to specify the
+ * addresses of some global constants so
+ * that I can find them across versions
+ * of the application. I can't figure out
+ * how to make gnu ld do that, so instead
+ * we just load the two files that include
+ * these defines in the right order here and
+ * expect things to 'just work'. Don't change
+ * the contents of those files, ok?
+ */
+ ao_romconfig.o(.romconfig*)
+ ao_product.o(.romconfig*)
+ *(.text*) /* Executable code */
+ *(.rodata*) /* Constants */
+
} > rom
.ARM.exidx : {
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
- __text_end__ = .;
} > rom
+ __text_end__ = .;
- . = ORIGIN(ram);
- __data_start__ = .;
+ /* Boot data which must live at the start of ram so that
+ * the application and bootloader share the same addresses.
+ * This must be all uninitialized data
+ */
+ .boot (NOLOAD) : {
+ __boot_start__ = .;
+ *(.boot)
+ . = ALIGN(4);
+ __boot_end__ = .;
+ } >ram
/* Data -- relocated to RAM, but written to ROM
*/
- .data : AT (ADDR(.ARM.exidx) + SIZEOF (.ARM.exidx)) {
+ .data : {
+ _start__ = .;
*(.data) /* initialized data */
- __data_end__ = .;
- __bss_start__ = .;
- } >ram
+ . = ALIGN(4);
+ _end__ = .;
+ } >ram AT>rom
.bss : {
+ __bss_start__ = .;
*(.bss)
*(COMMON)
+ . = ALIGN(4);
__bss_end__ = .;
} >ram
- PROVIDE(__stack__ = . + C_STACK_SIZE);
PROVIDE(end = .);
+ PROVIDE(__stack__ = ORIGIN(stack) + LENGTH(stack));
}
ENTRY(start);