Forum: Compiler & IDEs Neue Herausforderung für alten Fuchs (Grundlegende Fragen zum GCC & ARM)


von Ma H. (Gast)


Lesenswert?

Erst mal ein herzliches Hallo an alle!

Zur Einleitung:
Unser kleines (aber feines) Unternehemen hat sich (nach etwas Zögern) 
nun doch dafür entschieden für anstehende Neuentwicklungen auf einen ARM 
Core umzusteigen. Da wir seit Jahren fast ausschließlich Fujitsu (jetzt 
Spansion) MCUs einsetzen, für die in Europa die Softune Workbench IDE 
bereitgestellt wurde, sind wir nun auch gezwungen die IDE zu wechseln.
Aufgrund schlechter Erfahrungen mir IAR bzw. Keil haben wir uns für 
Eclipse + Kepler mit dem GNU C Cross ARM entschieden (iSystems WinIdea 
und Atollic sind zudem auch nur Eclipse & GUNC basierend.. also lieber 
gleich das Original),

Auf unserem ersten selbstenwickelten Prototype-DevBoard haben wir einen 
Spansion FM3 MB9BF516N eingesetzt, da auch die Peripherie nahezu 
identisch mit den proprietären Cores ist und unser besthender Code sich 
sehr einfach anpassen lässt.

Nun zum Problem/Fragestellung:
Nach dem ich mich die letzten Tage ausgiebig mit den Linker-Scripts und 
Compiler-Optionen auseinander gesetzt habe, habe ich trotz intensiver 
Internetrecherche keine Quellen gefunden, die mir folgende Fragen 
beantworten kann:

1. Einbindung der Libraries .. Mir ist noch nich ganz klar welche 
libraries was beinhalten/essentiel sind für reinen ANSI-C code (ohne 
dynamische Speicherwaltung). Es herrscht noch etwas Verwirrung in diesem 
Bibliotheken Dschungel.
Standardmässig Linker Options sind: -nostartfiles -nodefaultlibs -lgcc 
-lc -lm -lnosys (zugegeben nur abgekupfert)

2. Welchen GENAUEN Einfluß auf den Link-Vorgang hat die --specs=... 
Option.
z.B. --specs=nano.specs

3. bzw eine genaue und Verständliche Bescheibung der verschiedenen 
Link-Varianten (newlib vs. nano.specs, nosys.specs, redboot.specs etc..)

4. Gibt es irgendwo eine Liste/Beschreibung welche Sections im 
linker-script von den einzelnen Biblioteken erwartet werden, bzw. Linker 
symbole.
Hab nur einmal den Hinweis gefunden das z.B. die "newlib" im indirection 
file ein "PROVIDE(end = .);" in der ".heap" section erwartet (falls man 
malloc verwenden möchte).

Nur einige Beispiele um meine Verwirrung zu verdeutlichen:

a) Hier (aus CMSIS gcc_arm.ld) sind es
1
__bss_start__
 und
1
__bss_end__
 --> OK !
1
.bss :
2
{
3
  . = ALIGN(4);
4
  __bss_start__ = .;
5
  *(.bss*)
6
  *(COMMON)
7
  . = ALIGN(4);
8
  __bss_end__ = .;
9
} > RAM

b) Hier _sbss, __sbss, _ebss, __ebss (jeweils 2 Symbole mir der 
identischen VMA/LMA) --> Warum??
1
.bss : ALIGN(4)
2
 {
3
  . = ALIGN(4);
4
  _sbss = .;
5
  __sbss = _sbss;
6
  *(.bss*)
7
  *(COMMON)
8
  . = ALIGN(4);
9
  _ebss = .;
10
  __ebss = _ebss ;
11
} > RAM

c) Hier nur _end & __end (beide ebenfalls identisch) --> Warum??
1
.bss : ALIGN (8)
2
{
3
  *(.shbss)
4
  *(.bss .bss.* .gnu.linkonce.b.*)
5
  *(COMMON)
6
  . = ALIGN (8);
7
  *(.ram.b .bss.ram)
8
  . = ALIGN (8);
9
  _end = .;
10
  __end = .;
11
} >ram

d) Ohne Underscores/ sbss & ebss ausserhalb der "section definition"
1
sbss = .;
2
.bss : { * (.bss); }
3
 ebss = .;
4
 bss_size = ebss - sbss;
e) Hier die og. Definition  ("end = ." for newlib)
1
. = ALIGN(4);
2
    .heap :
3
    {
4
        __end__ = .;
5
        /* _heap_start = .; */
6
        /* "end" is used by newlib's syscalls!!! */
7
        PROVIDE(end = .);
8
        PROVIDE(_heap_start = end );
9
        . = . + heap_size;
10
        PROVIDE(_heap_end = .);
11
    } >RAM
Hier ist noch die Frage, mit welcher Priorität der Linker Symbole 
verarbeitet..
In der "startup_*.S" steht:
1
 .section .heap , "w" /* w = section is writable */
2
 .align 3
3
#ifdef __HEAP_SIZE__
4
 .equ __HeapSize, __HEAP_SIZE__
5
#else
6
 .equ __HeapSize, 0x00000400
7
#endif
8
 .globl __HeapStart
9
 .globl __HeapEnd
10
    .globl __HeapSize
11
__HeapStart:
12
 .if __HeapSize
13
 .space __HeapSize
14
 .endif
15
__HeapEnd:
und im indirection file (Linker Script)
1
.heap
2
{
3
   . = ALIGN(4) ;
4
   _sheap = .;
5
   *(.heap*);
6
    . = ALIGN(4) ;
7
   _eheap = .;
8
}
9
PROVIDE(__HeapStart = _sheap);
10
PROVIDE(__HeapEnd = _eheap);
11
PROVIDE(__HeapSize = SIZEOF(.heap));

Daraus ergibt sich die Frage welches Symbol hier Priorität hat.
Das __HeapSize aus dem asm file oder das __HeapSize aus dem indirection 
file?

Ich Danke schon im Voraus...
djb

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ma Hi schrieb:
> (ANM: jeweils 2xUnderscores -> werden hier aus Untersteichung angezeigt)

Deswegen:

Quelltext in [ c ] [ /c ] - Tags einschließen.

Ich mach' das mal für Dich.

von Ma H. (Gast)


Lesenswert?

OOPSS.. ;-)

Wer lesen kann... "Formatierung" usw...
ThanX

von Dr. Sommer (Gast)


Lesenswert?

Ma Hi schrieb:
> 1. Einbindung der Libraries .. Mir ist noch nich ganz klar welche
> libraries was beinhalten/essentiel sind für reinen ANSI-C code (ohne
> dynamische Speicherwaltung). Es herrscht noch etwas Verwirrung in diesem
> Bibliotheken Dschungel.
Der GCC findet die Libraries von selbst, man muss normalerweise gar 
nichts angeben, dann funktioniert es. Es sei denn man ist so schlau und 
gibt "-nostartfiles -nodefaultlibs" an, dann muss man von Hand 
dazulinken. libc ist - überraschung - die Standard C library mit 
Funktionen wie malloc,printf,memcpy... Die libgcc enthält 
Hilfs-Funktionen zu denen der Compiler automatisch Aufrufe generiert, 
wie zB double Arithmetik oder Exception Handling. Falls du den 
GCC-ARM-Embedded verwendest: Der verwendet als libc die newlib, da steht 
hier ( https://sourceware.org/newlib/ ) was enthalten ist. Die libgcc 
ist hier ( https://gcc.gnu.org/onlinedocs/gccint/Libgcc.html ) 
dokumentiert.
> 2. Welchen GENAUEN Einfluß auf den Link-Vorgang hat die --specs=...
> Option.
> z.B. --specs=nano.specs
spec files sind hier ( 
https://gcc.gnu.org/onlinedocs/gcc-3.1/gcc/Spec-Files.html ) 
dokumentiert. Welche mitgelieferte specs-Datei wofür ist, steht hier ( 
https://launchpadlibrarian.net/192227680/readme.txt ).

Ma Hi schrieb:
> Gibt es irgendwo eine Liste/Beschreibung welche Sections im
> linker-script von den einzelnen Biblioteken erwartet werden, bzw. Linker
> symbole.
Im Zweifelsfall im Quellcode der C-Library. Das ist eh am besten, wenn 
man es wie du so genau wissen will. Für die meisten Fälle kann man 
einfach das Beispiel-Linkerscript übernehmen.

Deine Fragen sind ja eher LD / GCC spezifisch und haben mir ARM nichts 
zu tun. Wenn dich diese Details so interessieren, müsstest du sie ja von 
anderen Plattformen her schon kennen ;-)

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.