Forum: Compiler & IDEs Fragen zu Linker Script


von Hans P. (Gast)


Lesenswert?

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

von W. M. (muhh)


Lesenswert?

Hans P. schrieb:
> *(.rodata.*)

Hallo Hans,

leider kann ich dir nicht helfen, aber da du schon einen Thread zum 
LinkerScript ertellt hast hätte ich da mal eine Frage an dich. Was macht 
die oben zitierte Zeile? Ich verstehe den .* hinter .rodata nicht. Was 
bewirkt diese "Anweisung"?

Viele Grüße
Willy

von Jim M. (turboj)


Lesenswert?

Die gcc Option "-fdata-sections" erzeugt u.a. Sektionen in der Form 
".rodata.Variablenname". Für die brauchts den ".*" als Platzhalter.

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.