Zweck von ARM-Linker-Dateien

Ich würde gerne wissen, was der Zweck der ARM-Scatter-Datei und der ARM-Linker-Adress-MAP-Datei ist. Wie helfen sie beim Kompilieren und schließlich beim Laden der ausführbaren Datei?

Verstehen Sie, was ein Linker im Allgemeinen ist, was er für Sie tut und warum Sie einen verwenden möchten?
Die MAP-Datei dient nur als Referenz für den Benutzer - sie wird nur vom Linker ausgegeben und von keiner Standardsoftwarekomponente verwendet.
@ Olin: Der Linker verknüpft verschiedene Programmmodule, so dass es keine ungelösten Verweise gibt.

Antworten (1)

Um C-Code in ein ausführbares Image zu kompilieren, das Sie auf einem ARM-Mikrocontroller ausführen können, sind zwei Schritte erforderlich: Kompilieren und Linken.

Beim Kompilieren wird der C-Code schließlich in Objektcode umgewandelt, der für sich allein nicht verwendbar ist. In der Mitte des Prozesses können Sie möglicherweise vorläufige Assembly-Listen für die C-Dateien erstellen.

Während des Linkens werden die Objektdateien alle miteinander kombiniert und die Funktionsaufrufe und globalen Variablen werden verknüpft. Es entscheidet auch, wo im Speicherbereich des Ziels alles landet (Code, Nur-Lesen-Daten, Lesen/Schreiben-Daten).

So können Sie so etwas aufrufen, printfohne den Code in Ihrer Datei zu haben. Wenn Sie kompilieren, weiß es nichts über printfaußer dem Prototyp in stdio.h. Bei der Verknüpfung füllt der Linker die Details darüber aus, wo sich printfder Speicher tatsächlich befindet.

Der Linker verwendet eine Scatter-Datei, um zu wissen, wo im Ziel bestimmte Speicherbereiche vorhanden sind. Typischerweise ordnet ein Mikrocontroller den internen Flash der Adresse zu 0x00000000. Internes SRAM existiert an einer anderen Adresse, sagen wir 0x20000000, und externes DRAM oder Flash könnte an einer anderen Adresse existieren, 0x80000000. Die Scatter-Datei informiert den Linker über diese Bereiche und weist ihn an, bestimmte Abschnitte der Ausgabe in bestimmten Bereichen zu platzieren. Normalerweise befindet sich Ihr ausführbarer Code in dem textAbschnitt, der normalerweise in Ihrem internen Flash gespeichert wird. Ihre schreibgeschützten Daten würden in dem aufgerufenen Abschnitt leben rodataund auch im Flash gespeichert werden. Lese-/Schreibdaten sind normalerweise in bss(auf Null initialisiert) oderdata(mit Wert initialisiert), und dies würde im RAM platziert, wobei initialisierte Werte in einem anderen Abschnitt im Flash gespeichert werden.

Diese Abschnittsnamen sind in gewisser Weise Toolchain-spezifisch, obwohl sie normalerweise für alle Tools ähnlich sind.

Die Linker-Map-Datei ist eine Ausgabedatei, die Ihnen nach dem Linken mitteilt, wo all Ihre Symbole gelandet sind. Beispielsweise kann es Ihnen sagen, dass sich in Flash main()befindet 0x00000278und dass sich die globale Variable in RAM int xbefindet . 0x20001012Es wird Ihnen auch sagen, wo Linker-generierte Abschnitte platziert wurden. Dazu gehören Ihr C-Stack, möglicherweise ein Interrupt-Stack und möglicherweise auch ein Heap. In der Scatter-Datei können Sie normalerweise auch die Größe dieser Abschnitte angeben.

Tolle Erklärung! Darf ich fragen, ob das Linker-Skript dasselbe ist wie bei Scatter-Dateien?
"Scatter-Datei" scheint ein allgemeinerer Begriff für jede Datei zu sein, die den Speicher abbildet und wohin die Dinge gehen sollen. Ich würde eine Linker-Skriptdatei als eine bestimmte Art von Scatter-Datei betrachten, die angibt, wohin die Linker-Abschnitte gehen sollen. Dies ist jedoch subjektiv.