2010-03-11 4 views
71

Die endgültigen Bilder von Compliers enthalten sowohl bin-Datei und Extended Loader-Format ELf-Datei, was ist der Unterschied zwischen den beiden, vor allem der Nutzen der ELF-Datei.Was ist der Unterschied zwischen ELF-Dateien und bin-Dateien?

+0

[Dies ist, was NASM zu sagen hat] (http://www.nasm.us/doc/nasmdoc7.html#section-7.1). Nicht ARM-spezifisch, aber wahrscheinlich das gleiche Konzept. Wenn z. B. eine Datei kompiliert wird, die nur "NOP" ohne "-f" (oder "-fbin") enthält, kompiliert sie zu einem einzelnen Byte "0x90" anstelle eines 400-Byte-ELF-Containers mit "-felf32". Also nur der rohe Code, keine Container-Metadaten. NASM sagt, dass es meistens für MS-DOS .COM und [.SYS] (https://en.wikipedia.org/wiki/.sys) Dateien verwendet wird. 'section' Direktiven werden meist ignoriert und generieren nur die Ausrichtung. –

+0

Dies ist eine Möglichkeit, in der bin-Dateien nützlich sein können: einen Boot-Sektor für die Bereitstellung von Betriebssystemen zu erstellen: http: // stackoverflow.com/a/32483545/895245 –

Antwort

71

Eine Bin-Datei ist eine reine Binärdatei ohne Speicherkorrekturen oder -verlagerungen. Es ist sehr wahrscheinlich, dass sie explizite Anweisungen enthält, die an einer bestimmten Speicheradresse geladen werden. Wobei ...

ELF Dateien sind ausführbar Verknüpfbares Format, das aus einer Symbolsuche und einer verschiebbaren Tabelle besteht, dh es kann vom Kernel an jeder Speicheradresse geladen werden und automatisch werden alle verwendeten Symbole angepasst zum Offset von dieser Speicheradresse, in die es geladen wurde. Normalerweise haben ELF-Dateien eine Reihe von Abschnitten, wie 'Daten', 'Text', 'BSS', um nur einige zu nennen ... es ist in den Abschnitten, wo die Laufzeit berechnen kann, wo die Speicherreferenzen des Symbols angepasst werden dynamisch zur Laufzeit.

+0

"mehr als wahrscheinlich, es hat explizite Anweisungen an einer bestimmten Speicheradresse geladen werden": Bedeutet dies, dass der bin-Datei-Generierungsprozess zusätzlichen Code zum Laden von Daten an bestimmte Adresse hinzugefügt? – xiaobai

+1

Soweit ich gelernt habe, ist die bin-Datei wie das Programm von Offset 0 ausgeführt und das Datensegment ist eingebettet. Wenn das falsch ist, korrigiere mich bitte. –

+0

@MartinKersten korrekt, bin-Dateien beginnen von Offset 0 – t0mm13b

21

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

ELF-Format ist in der Regel die Standardausgabe der Zusammenstellung. wenn Sie GNU Toolketten verwenden, können Sie es in der binären Format übersetzen, indem mit objcopy, wie zum Beispiel:

arm-elf-objcopy -O binary [elf-input-file] [binary-output-file] 

oder mit fromELF Dienstprogramm (wie zB ADS in den meisten IDEs gebaut obwohl):

fromelf -bin -o [binary-output-file] [elf-input-file] 
+1

-1. Dies beantwortet nicht die Frage, was die bin-Datei ist. – xiaobai

+6

Dies wurde hinzugefügt, nachdem das bin-Dateidetail beantwortet wurde, und * fügt * eine praktisch nützliche Technik hinzu. +1 dafür. – erbdex

26

Eine bin-Datei ist nur die Bits und Bytes, die in die ROM oder eine bestimmte Adresse gehen, von der aus Sie das Programm ausführen. Sie können diese Daten nehmen und sie direkt laden, so wie Sie sind, Sie müssen wissen, was die Basisadresse ist, da diese normalerweise nicht da ist.

Eine Elf-Datei enthält die bin-Informationen, aber es ist umgeben von vielen anderen Informationen, mögliche Debug-Informationen, Symbole, können Code von Daten innerhalb der Binärdatei unterscheiden. Erlaubt mehr als einen Teil der Binärdaten (wenn Sie eine davon in eine Bin ablegen, erhalten Sie eine große Bin-Datei mit Fülldaten, um sie auf den nächsten Block aufzufüllen). Gibt an, wie viele Binärdateien Sie haben und wie viele BSS-Daten vorhanden sind, die auf Nullen initialisiert werden sollen (Gnu-Tools haben Probleme, Bin-Dateien korrekt zu erstellen).

Das Elf-Dateiformat ist ein Standard, Arm veröffentlicht seine Erweiterungen/Variationen auf dem Standard. Ich empfehle jedem, ein Elf-Parsing-Programm zu schreiben, um zu verstehen, was da drin ist, nicht mit einer Bibliothek, es ist ziemlich einfach, nur die Informationen und Strukturen in der Spezifikation zu verwenden. Hilft Gnu-Problemen beim Erstellen von .bin-Dateien sowie beim Debuggen von Linker-Skripten und anderen Dingen, die dazu beitragen können, die Bin- oder Elf-Ausgabe zu stören.

Verwandte Themen