Was ist der Unterschied zwischen ELF-Dateien und Bin-Dateien?

97

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?

Manik Mahajan
quelle
Das hat NASM zu sagen . Nicht ARM-spezifisch, aber wahrscheinlich das gleiche Konzept. Wenn Sie beispielsweise eine Datei kompilieren, die nur NOPohne -f(oder -fbin) enthält, wird sie in ein einzelnes Byte kompiliert 0x90, 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. sectionDirektiven werden meist ignoriert und erzeugen nur Alignment.
Ciro Santilli 法轮功 冠状 病 六四 事件 29
Dies ist eine Möglichkeit, wie Bin-Dateien nützlich sein können: um einen Bootsektor für die Bereitstellung von Betriebssystemen zu erstellen: stackoverflow.com/a/32483545/895245
Ciro Santilli 法轮功 冠状 病 六四 事件 17

Antworten:

93

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.

t0mm13b
quelle
"Höchstwahrscheinlich enthält es explizite Anweisungen zum Laden an eine bestimmte Speicheradresse": Bedeutet dies, dass der Bin-Datei-Generierungsprozess zusätzlichen Code zum Laden von Daten an eine bestimmte Adresse hinzufügt?
Penghe Geng
1
Soweit ich erfahren habe, ist die Bin-Datei so, als würde man das Programm ab Offset 0 ausführen und das Datensegment ist darin eingebettet. Wenn dies falsch ist, korrigieren Sie mich bitte.
Martin Kersten
@ MartinKersten richtig, bin Dateien beginnen mit Offset 0.
t0mm13b
1
@ t0mm13b Also können .elf-Dateien wie eine normale .hex-Datei auf einen Mikrocontroller gebrannt werden, benötigen jedoch mehr Flash-Speicher, und jedes Mal, wenn das Mikro zurückgesetzt wird, werden in den Abschnitten Änderungen behandelt?
Aelgawad
@ BlackyDucky, ich glaube nicht, dass das möglich ist. Wenn ein Mikrocontroller versuchen würde, ELF-Daten direkt auszuführen, würde er die Header und andere Daten als Anweisungen falsch interpretieren, oder?
iX3
40

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.

Oldtimer
quelle
1
0x7C00 klingt wie ein Bootloader, der nicht unbedingt elf verwendet. Dies ist eine allgemeine Frage. Ein Betriebssystem hätte Regeln für die (virtuellen) Adressräume, die Toolchain müsste auf diese Betriebssystemregeln ausgerichtet sein, dann würde das Dateiformat ladbare Elemente mit Adressen plus einem einmal geladenen Einstiegspunkt und anderen Dingen anzeigen. elf ist nur ein Behälter, wie eine Schachtel, man muss ihn richtig für den gezielten Anwendungsfall verpacken.
old_timer
1
Wenn Sie einige ASCII in die VGA drucken möchten, schreiben Sie ein Programm , das einige Daten enthält oder die Daten im laufenden Betrieb oder in einer Kombination mathematisch generiert. Anschließend laden Sie dieses Programm in den vom Betriebssystem definierten Codebereich und führen es aus es. Sie schieben Daten im Allgemeinen nicht direkt in ein physisches Peripheriegerät, und es ist das seltene Betriebssystem, mit dem Sie dies sowieso tun oder dem Loader erlauben würden, dies zu tun.
old_timer
1
Für Bare Metal, insbesondere wenn diese Elf-Datei der Bootloader ist und / oder das erste Programm ausgeführt wird, sind der Einstiegspunkt und _start nicht relevant, da Sie die Elf-Datei als Sprungbrett für ein Tool verwenden, das den Flash programmiert (wie openocd over) jtag) oder durch was auch immer-objcopy -O binäre Datei.elf file.bin und dann wird diese Datei irgendwie in den Flash geladen. Ich bin nicht gegangen und habe einen Bootloader auf x86 ausprobiert, aber ich gehe davon aus, dass das BIOS Elf-Dateien nicht analysieren kann, sodass es auch ein Speicher-Image sein muss. also eine Bin-Datei vom Typ -O binär
old_timer
1
Die separate Entität ist die Hardware / Logik oder ein anderes Design. Für Betriebssysteme legt das Betriebssystem die Regeln fest, für einen Mikrocontroller legt das Chip- / Prozessordesign die Regeln fest. Wenn beispielsweise eine Vektortabelle vorhanden ist und die Vektoren dann auf die Handler verweisen, müssen Sie all dies in Ihr Linkerskript usw. rollen, damit die ladbaren Daten für den Flash bestimmt sind, von dem das Ding startet.
old_timer
1
Um zu erweitern, dass Ihr Ziel Regeln hat, sei es ein Betriebssystem oder ein Prozessor oder ein mehrstufiger Bootloader usw. Und Sie müssen Ihre "Binärdatei" basierend auf diesen Regeln erstellen, wobei Bootstrap und Linkerscript am wichtigsten sind. Dann ist es sehr weit gefasst, was jedes Ziel betrifft und wie Sie diese Binärdatei anwenden und welche Dateiformate unterstützt werden. Angenommen, gnu ist auf einer Reihe von Host-Entwicklungsplattformen das Elf-Dateiformat die Standardausgabe. Anschließend verwenden Sie nach Bedarf Tools (sofern dies auf bestimmte Dienstprogramme / Loader abzielt), um Elf zu extrahieren oder in etwas anderes zu konvertieren.
old_timer
30

Einige Ressourcen:

  1. ELF für die ARM-Architektur
    http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf
  2. ELF aus dem Wiki
    http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

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]
wenlujon
quelle
6
Dies wurde hinzugefügt , nachdem die bin - Datei ausführlich beantwortet wurde, und hat Add-on eine praktisch nützliche Technik. +1 dafür.
Erbdex
-1

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.

Ahmed Gamal
quelle
Abgestimmt, weil es die Frage nicht beantwortet oder unbedingt richtig ist. Im weitesten Sinne umfasst die Kompilierung das Verknüpfen. Zitat aus der ldDokumentation : Normalerweise besteht der letzte Schritt beim Kompilieren eines Programms darin, ld auszuführen.
bzeaman