Yagarto + C++

Gast #1707042
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
Gast #1707263
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
Moderator Persönliche Seite #1707296
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.