Die endgültigen Bilder, die von Compliern erstellt wurden, enthalten sowohl eine Bin-Datei als auch eine ELf-Datei im Extended Loader-Format. Was ist der Unterschied zwischen beiden, insbesondere das Dienstprogramm der ELF-Datei?
Die endgültigen Bilder, die von Compliern erstellt wurden, enthalten sowohl eine Bin-Datei als auch eine ELf-Datei im Extended Loader-Format. Was ist der Unterschied zwischen beiden, insbesondere das Dienstprogramm der ELF-Datei?
Antworten:
Eine Bin-Datei ist eine reine Binärdatei ohne Speicherkorrekturen oder -verschiebungen. Höchstwahrscheinlich enthält sie explizite Anweisungen zum Laden an eine bestimmte Speicheradresse. Wohingegen....
ELF- Dateien sind im ausführbaren verknüpfbaren Format, das aus einer Symbolsuche und einer verschiebbaren Tabelle besteht. Das heißt, sie können vom Kernel an eine beliebige Speicheradresse geladen werden und alle verwendeten Symbole werden automatisch an den Versatz von der Speicheradresse angepasst, an der sie sich befinden wurde in geladen. Normalerweise haben ELF-Dateien eine Reihe von Abschnitten, wie z. B. 'Daten', 'Text', 'BSS', um nur einige zu nennen. In diesen Abschnitten kann die Laufzeit berechnen, wo die Speicherreferenzen des Symbols angepasst werden sollen dynamisch zur Laufzeit.
Eine bin-Datei besteht nur aus den Bits und Bytes, die in das ROM oder eine bestimmte Adresse eingegeben werden, von der aus Sie das Programm ausführen. Sie können diese Daten direkt wie sie sind laden. Sie müssen jedoch wissen, wie die Basisadresse lautet, da diese normalerweise nicht vorhanden ist.
Eine Elf-Datei enthält die Bin-Informationen, ist jedoch von vielen anderen Informationen umgeben. Mögliche Debug-Informationen und Symbole können Code von Daten innerhalb der Binärdatei unterscheiden. Ermöglicht mehr als einen Block Binärdaten (wenn Sie einen dieser Daten in einen Bin werfen, erhalten Sie eine große Bin-Datei mit Fülldaten, um sie auf den nächsten Block aufzufüllen). Zeigt an, wie viel Binärdaten Sie haben und wie viele BSS-Daten vorhanden sind, die auf Null initialisiert werden sollen (Gnu-Tools haben Probleme beim korrekten Erstellen von Bin-Dateien).
Das elf-Dateiformat ist ein Standard, arm veröffentlicht seine Verbesserungen / Variationen des Standards. Ich empfehle jedem, ein Elfen-Parsing-Programm zu schreiben, um zu verstehen, was sich dort befindet. Kümmern Sie sich nicht um eine Bibliothek. Es ist ganz einfach, nur die Informationen und Strukturen in der Spezifikation zu verwenden. Hilft bei der Überwindung von Gnu-Problemen beim allgemeinen Erstellen von .bin-Dateien sowie beim Debuggen von Linker-Skripten und anderen Dingen, die dazu beitragen können, Ihre Bin- oder Elf-Ausgabe durcheinander zu bringen.
Einige Ressourcen:
Das ELF-Format ist im Allgemeinen die Standardausgabe beim Kompilieren. Wenn Sie GNU-Toolketten verwenden, können Sie diese mithilfe von objcopy in das Binärformat übersetzen, z.
arm-elf-objcopy -O binary [elf-input-file] [binary-output-file]
oder mit dem Dienstprogramm fromELF (in den meisten IDEs wie ADS integriert):
fromelf -bin -o [binary-output-file] [elf-input-file]
Ich möchte hier nur einen Punkt korrigieren. Die ELF-Datei wird vom Linker erstellt, nicht vom Compiler.
Die Compiler-Mission endet, nachdem die Objektdateien (* .o) aus den Quellcodedateien erstellt wurden. Linker verknüpft alle .o-Dateien miteinander und erzeugt den ELF.
ld
Dokumentation : Normalerweise besteht der letzte Schritt beim Kompilieren eines Programms darin, ld auszuführen.
NOP
ohne-f
(oder-fbin
) enthält, wird sie in ein einzelnes Byte kompiliert0x90
, anstatt in einen 400-Byte-ELF-Container mit-felf32
. Also nur der Rohcode, keine Containermetadaten. NASM sagt, dass es hauptsächlich für MS-DOS .COM- und .SYS- Dateien verwendet wird.section
Direktiven werden meist ignoriert und erzeugen nur Alignment.