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
und
--> 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