Schönen guten Morgen,
ich hätte da ein paar Fragen zu Linker scripts:
1. im Example der ld Beschreibung sieht es recht einfach aus:
1 | SECTIONS {
|
2 | outputa 0x10000 :
|
3 | {
|
4 | all.o
|
5 | foo.o (.input1)
|
6 | }
|
7 | outputb :
|
8 | {
|
9 | foo.o (.input2)
|
10 | foo1.o (.input1)
|
11 | }
|
12 | outputc :
|
13 | {
|
14 | *(.input1)
|
15 | *(.input2)
|
16 | }
|
17 | }
|
Ich habe nun im meinem Projekt einige Funktion via Attribute in
mySection gemaped, dies funktioniert auch nur möchte ich zusätzlich die
uart.c->.o in diese Section legen, dies müsste doch so funktionieren?
1 | mySection 0x07800000 : AT (0x07800000)
|
2 | {
|
3 | uart.o
|
4 | *(mySectionFunctions)
|
5 |
|
6 | }
|
7 | .text 0xFFFF0100 : AT (0xFFFF0100)
|
8 | {
|
9 | *(.text)
|
10 | *(.text.*)
|
11 | *(P)
|
12 | etext = .;
|
13 | }
|
Sobald ich das aber bei mir anwende bekomme ich sofort einen "multiple
definition of" Error des Linkers für die Funktion die in der uart.o ist.
Die mySectionFunctions versehenen Funktionen sind richtig.
2. Gibt es eine Möglichkeit ein gesamtes Archiv .a File via Linker
script in eine section zu legen, oder muss ich die .o des .a raustrennen
und einzelen dann einfügen (falls der erste Punkt gelöst ist)
3. gcc hat doch .text für Funktionen und .rodata für const Daten. Er
legt aber noch weitere Daten an die nur mit "C" im Map erscheinen. Sieht
aus aus als wären dies zB JumpTable einer Switch Anweisung in einer
Funktion. Muss ich die händisch mappen? Das komische ist nämlich, dass
die Funktionen der mySectionFunctions zwar in der richtigen Section
liegen, der linker aber stur die C Informationen in der .rodata belässt.
1 | .rodata :
|
2 | {
|
3 | *(.rodata)
|
4 | *(.rodata.*)
|
5 | *(C_1)
|
6 | *(C_2)
|
7 | *(C)
|
8 | _erodata = .;
|
9 | }
|
Vielen Dank für Eure Unterstützung, stehe ich wirklich an und bräuchte
Hilfe!
Hans
PS.: gcc 4.7.3