Hallo,
ich nutze seit einer Weile die Yagarto-Toolchain (arm-elf-gcc) mit einem
SAM7XC-EK-Board. Das läuft mit C soweit auch ganz gut, allerdings möchte
ich nun auch C++-Code auf dem Board zum Laufen bringen.
Um das zu erreichen habe ich zunächst in meiner Makefile folgende
Anpassungen vorgenommen:
1 | AS=$(CROSS_COMPILE)gcc
|
2 | CC=$(CROSS_COMPILE)gcc
|
3 | LD=$(CROSS_COMPILE)gcc
|
geändert zu:
1 | AS=$(CROSS_COMPILE)gcc
|
2 | CC=$(CROSS_COMPILE)gcc
|
3 | CPP=$(CROSS_COMPILE)g++
|
4 | LD=$(CROSS_COMPILE)g++
|
mit diesen Flags:
1 | CPPFLAGS=-g -mcpu=arm7tdmi $(OPTIM) -Wall -I$(INCL) -D $(TARGET)
|
2 | LDFLAGS+=-nostartfiles -Wl,--cref
|
3 | LDFLAGS+=-lc -lgcc
|
4 | LDFLAGS+=-T elf32-littlearm.lds
|
Wenn ich den Code nach diesen Änderungen kompiliere erhalte ich folgende
Fehlermeldungen:
1 | ld.exe: section .data [0022b19c -> 0022da43] overlaps section .gcc_except_table [0022b19c -> 0022b2fb]
|
2 | ld.exe: section .text._ZN8ListElemC1Ev [0022b2fc -> 0022b2ff] overlaps section .data [0022b19c -> 0022da43]
|
Ich nehme an, ich hab schon bei den Änderungen der Makefile Fehler
gemacht, allerdings hab ich noch ein wenig rumprobiert und mein
LinkerScript:
1 | OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
|
2 | OUTPUT_ARCH(arm)
|
3 | ENTRY(reset_handler)
|
4 |
|
5 | SECTIONS
|
6 | {
|
7 | .text : {
|
8 | _stext = .;
|
9 | *(.text)
|
10 | *(.rodata) /* read-only data (constants) */
|
11 | *(.rodata*)
|
12 | . = ALIGN(4);
|
13 | _etext = . ;
|
14 | }
|
15 | /* collect all initialized .data sections that go into FLASH */
|
16 | .data : AT ( ADDR (.text) + SIZEOF (.text)) {
|
17 | _sdata = .;
|
18 | *(.vectors)
|
19 | *(.data)
|
20 | _edata = .;
|
21 | }
|
22 | /* collect all uninitialized .bss sections that go into FLASH */
|
23 | .bss (NOLOAD) : {
|
24 | . = ALIGN(4);
|
25 | _sbss = .;
|
26 | *(.bss)
|
27 | _ebss = .;
|
28 | }
|
29 | }
|
30 | end = .;
|
angepasst:
1 | .data : AT ( ADDR (.text) + SIZEOF (.text) + 1780)
|
(Den Wert 1780 hab ich nach rumprobieren ausgewählt).
Mir ist bewusst, dass das ein ziemlich hässlicher Workaround ist.
Jedenfalls kompiliert das Programm nach diesen Änderungen und lässt sich
auf das Board flashen. Allerdings funktionieren nun teilweise selbst
einfachste Wertzuweisungen innerhalb des Programms nicht. Da ich vorher
nie C++ auf einem Mikrokontroller genutzt habe werd ich also (abgesehn
von dem hässlichen Workaround) wahrscheinlich einige Anfängerfehler
gemacht haben. Hoffe mir kann jmd dabei helfen.
Danke, Roland