Forum: Compiler & IDEs Yagarto + C++


von Roland (Gast)


Lesenswert?

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

von klaus (Gast)


Lesenswert?

Ich würde dir zum Thema Linker Scripte folgenden Link an die Hand geben 
wollen:

http://www.delorie.com/gnu/docs/binutils/ld_toc.html#SEC_Contents

Es wird imho vieles besser wenn du mit MEMORY deine Speicherbereiche 
definierst und im SECTIONS Bereich explizit zuweist.

Üblicherweise macht man dann bei Sektionen bei denen die VMA von der LMA 
abweicht (wie beu der .data Section der Fall ) das ganze dann so:
1
.data : {
2
3
} >RAM AT >FLASH

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Linkerscript scheint mir etwas arg einfach. Habe das ein wenig mehr 
einbauen müssen für C++-Unterstützung. Falls im Startup-Code keine 
Aufrufe für statische Objekte drin ist, sollte man diese ergänzen. 
Selbst habe ich bisher C++ Projekte für "kleine" Controller ohne 
Unterstützung für RTTI und excpetions compliert (siehe Optionen in den 
Makefiles der im Folgenden verlinkten Beispiele).

Mglw. hilft das etwas weiter: 
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/#cm3_cpp1
Folgendes ist aber zu beachten:
- Es ist mit einer arm-eabi toolchain getested. Codesourcery G++ lite 
for ARM-EABI ist eine solche (kost' nix). Die neuste Version von Yagarto 
ist ebenfalls für Target arm-eabi (weiss aber nicht, ob die schon 
offiziell ist.)
- Code ist getestet mit STM32. Die Besonderheiten betr. 
C++-Unterstützung ist aber unabhängig vom verwendeten Controller, 
Beispiel sollte sich also recht einfach auf andere Controller anpassen 
lassen.

Dann hätte ich noch das:
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/index_at91.html#at91_cpp
Das Beispiel ist schon etwas älter und wurde seinerzeit mit einer 
arm-elf Toolchain getestet (mein inzwischen "uraltens" WinARM 6/2006). 
Test mit Yagarto arm-elf ist aber übersichtlicher Zeitaufwand.

von Roland (Gast)


Lesenswert?

gut danke erstmal, ich werd mir die Beispiele mal angucken

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.