diff options
author | Marti Bolivar <mbolivar@leaflabs.com> | 2012-04-11 16:56:20 -0400 |
---|---|---|
committer | Marti Bolivar <mbolivar@leaflabs.com> | 2012-04-11 16:56:50 -0400 |
commit | 71347f8f430e28b5e5ed565bc5c5f5142c2314e0 (patch) | |
tree | e5eb0377dcad27bb26155266c0ea7047f8cab671 | |
parent | 33c40cbbf0ea025b7e0bf39a4703cf239cc09e08 (diff) | |
download | librambutan-71347f8f430e28b5e5ed565bc5c5f5142c2314e0.tar.gz librambutan-71347f8f430e28b5e5ed565bc5c5f5142c2314e0.zip |
Fix linking and C runtime initialization on F1.
Reorder the .data and .rodata sections in common.inc. This seems
necessary to get the linker to place the data ROM disk and the pointer
to it in the right places.
Switch from long long to int in start_c.c. I have no idea why this
helps, but it does. F1 will crash if you don't do this. It will
probably slow things down unnecessarily on F2, but I don't care.
Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
-rw-r--r-- | support/ld/common.inc | 53 | ||||
-rw-r--r-- | wirish/start_c.c | 19 |
2 files changed, 33 insertions, 39 deletions
diff --git a/support/ld/common.inc b/support/ld/common.inc index 926f9eb..f749b19 100644 --- a/support/ld/common.inc +++ b/support/ld/common.inc @@ -102,29 +102,6 @@ SECTIONS } > REGION_TEXT /* - * Read-only data - */ - .rodata : - { - *(.rodata .rodata.* .gnu.linkonce.r.*) - - /* ROM image configuration; for C startup */ - . = ALIGN(4); - _lm_rom_img_cfgp = .; - LONG(LOADADDR(.data)); - } > REGION_RODATA - - /* - * .ARM.exidx exception unwinding; mandated by ARM's C++ ABI - */ - __exidx_start = .; - .ARM.exidx : - { - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - } > REGION_RODATA - __exidx_end = .; - - /* * End of text */ .text.align : @@ -134,12 +111,14 @@ SECTIONS } > REGION_TEXT /* - * .USER_FLASH: We allow users to allocate into Flash here + * .ARM.exidx exception unwinding; mandated by ARM's C++ ABI */ - .USER_FLASH : + __exidx_start = .; + .ARM.exidx : { - *(.USER_FLASH) + *(.ARM.exidx* .gnu.linkonce.armexidx.*) } > REGION_RODATA + __exidx_end = .; /* * .data @@ -152,6 +131,22 @@ SECTIONS *(.got.plt) *(.got) *(.data .data.* .gnu.linkonce.d.*) + . = ALIGN(8); + _edata = .; + } > REGION_DATA AT> REGION_RODATA + + /* + * Read-only data + */ + .rodata : + { + *(.rodata .rodata.* .gnu.linkonce.r.*) + /* .USER_FLASH: We allow users to allocate into Flash here */ + *(.USER_FLASH) + /* ROM image configuration; for C startup */ + . = ALIGN(4); + _lm_rom_img_cfgp = .; + LONG(LOADADDR(.data)); /* * Heap: Linker scripts may choose a custom heap by overriding * _lm_heap_start and _lm_heap_end. Otherwise, the heap is in @@ -163,9 +158,7 @@ SECTIONS */ _lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end; _lm_heap_end = DEFINED(_lm_heap_end) ? _lm_heap_end : __msp_init; - . = ALIGN (8); - _edata = .; - } > REGION_DATA AT> REGION_TEXT + } > REGION_RODATA /* * .bss @@ -179,7 +172,7 @@ SECTIONS . = ALIGN (8); _ebss = .; _end = _ebss; - } > REGION_BSS AT> REGION_TEXT + } > REGION_BSS /* * Debugging sections diff --git a/wirish/start_c.c b/wirish/start_c.c index ae42087..301565c 100644 --- a/wirish/start_c.c +++ b/wirish/start_c.c @@ -54,39 +54,40 @@ extern char _data, _edata; extern char _bss, _ebss; struct rom_img_cfg { - long long *img_start; + int *img_start; }; extern char _lm_rom_img_cfgp; void __attribute__((noreturn)) start_c(void) { struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp; - long long *src; - long long *dst; + int *src = img_cfg->img_start; + int *dst = (int*)&_data; int exit_code; /* Initialize .data, if necessary. */ - src = img_cfg->img_start; - dst = (long long*)&_data; if (src != dst) { - while (dst < (long long*)&_edata) { + int *end = (int*)&_edata; + while (dst < end) { *dst++ = *src++; } } /* Zero .bss. */ - dst = (long long*)&_bss; - while (dst < (long long*)&_ebss) { + dst = (int*)&_bss; + while (dst < (int*)&_ebss) { *dst++ = 0; } /* Run initializers. */ __libc_init_array(); - exit_code = main(0, NULL, NULL); + /* Jump to main. */ + exit_code = main(0, 0, 0); if (exit) { exit(exit_code); } + /* If exit is NULL, make sure we don't return. */ for (;;) continue; |