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.