Forum: PC-Programmierung Linker Script Basics


von J. W. (nuernberger)


Lesenswert?

Tutorials gibt es viele, z.B.
http://www.scoberlin.de/content/media/http/informatik/gcc_docs/ld_3.html

Aber trotzdem fehlen mir Infos.
Z.B.
1
.fastcode : {
2
        __fastcode_load = LOADADDR (.fastcode);
3
        __fastcode_start = .;
4
5
        *(.glue_7t) *(.glue_7)
6
        *isr.o (.text.*)
7
        *(.text.fastcode)
8
        *(.text.Blinky_dispatch)
9
        /* add other modules here ... */
10
11
        . = ALIGN (4);
12
        __fastcode_end = .;
13
    } >RAM AT>ROM

Die Ausdrucksweise ">RAM AT>ROM" fand ich nirgendwo erklärt.
Ich vermute mal, der Code soll ins ROM, aber beim Startup ins RAM 
kopiert werden und dann "exekutiert".

Ich entwickle schon seit langer Zeit embedded Systems mit GNU-Tools, 
aber konnte mich immer um die Linker Details herumdrücken, da schon eine 
Vorlage existierte.
Jetzt bin ich an einem Renesas RX62N dran und verzweifle.

Kennt jemand einen guten Einstieg in Linker-Script?

von J. W. (nuernberger)


Lesenswert?

Was bedeuten eigentlich die Symbole
1
    *(COMMON)
2
    *(B)
3
    *(B_1)
4
    *(B_2)
?

(.text, .data, .bss ist überall erklärt, aber nicht die obigen)

von Andreas B. (andreas_b77)


Lesenswert?

J. Wa. schrieb:
> Die Ausdrucksweise ">RAM AT>ROM" fand ich nirgendwo erklärt.

In der Doku zu GNU ld steht das alles drin.

> Ich vermute mal, der Code soll ins ROM, aber beim Startup ins RAM
> kopiert werden und dann "exekutiert".

Stimmt so allgemein. Genauer bekommt die Sektion virtuelle Adressen, die 
an den Speicherbereich "RAM" angehängt, hinter anderen Sektionen die 
schon dort sind. Die Terminologie stammt aus dem Unix-Bereich. Da die 
Mikrocontroller keine Speicherumsetzung haben, heißt "virtuelle Adresse" 
einfach die Adresse, die bei der Ausführung gültig ist.

Die Lade-Adressen (und auch die Daten) werden dagegen an den 
Speicherbereich "ROM" angehängt.

Wie RAM und ROM definiert sind, muss man dem Linker vorher auch sagen. 
Außerdem berechnet der Linker nur die Adressen und relokiert alle 
Referenzen auf Symbole entsprechend. Dafür, dass die Daten auch vom ROM 
ins RAM an die korrekten "virtuellen" Adressen geladen werden, muss der 
Startup-Code sorgen. Der Linker hat damit nichts am Hut.


J. Wa. schrieb:
> Was bedeuten eigentlich die Symbole
>     *(COMMON)
>     *(B)
>     *(B_1)
>     *(B_2)
> ?
>
> (.text, .data, .bss ist überall erklärt, aber nicht die obigen)

Das sind keine Symbole, das sind Sektionen. *(COMMON) heißt, "nimm aus 
jeder Datei die Sektion COMMON und hänge den Inhalt hier an". COMMON ist 
alte Tradition für globale Variablen, da werden in mehreren Dateien 
definierte Symbole mit dem selben Namen verschmolzen.

B, B_1 und B_2 ist irgendwas spezielles, das kenne ich nicht. Bei 
Formaten wie ELF kann man ja beliebig benannte Sektionen definieren.

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.