ELFファイルとbinファイルの違いは何ですか?


97

コンパイラーによって生成される最終的なイメージには、binファイルと拡張ローダー形式のELfファイルの両方が含まれます。これら2つの違いは何ですか(特にELFファイルのユーティリティ)。


これはNASMが言わなければならないことです。ARM固有ではありませんが、同じ概念である可能性があります。たとえば、(または)だけNOPを含まないファイルをコンパイルすると、400バイトのELFコンテナではなく、1バイトにコンパイルされます。つまり、生のコードだけで、コンテナのメタデータはありません。NASMによると、これは主にMS-DOS .COMおよび.SYSファイルに使用されます。ディレクティブはほとんど無視され、アライメントのみが生成されます。-f-fbin0x90-felf32section
Ciro Santilli郝海东冠状病六四事件法轮功

:デプロイオペレーティングシステムにブートセクタを作るために:これは、ビンファイルが有用であることが可能な一つの方法であるstackoverflow.com/a/32483545/895245
チロSantilli郝海东冠状病六四事件法轮功

回答:


93

Binファイルは、メモリの修正や再配置を行わない純粋なバイナリファイルであり、特定のメモリアドレスにロードする明示的な命令が含まれている可能性が高いです。ところが……。

ELFファイルは、シンボルルックアップと再配置可能テーブルで構成される実行可能リンク可能形式です。つまり、カーネルによって任意のメモリアドレスにロードでき、使用されるすべてのシンボルは、そのメモリアドレスからのオフセットに自動的に調整されます。に読み込まれました。通常、ELFファイルには「データ」、「テキスト」、「bss」などのセクションがいくつかありますが、いくつかのセクション内にあり、ランタイムがシンボルのメモリ参照を調整する場所を計算できるセクションにあります実行時に動的に。


「特定のメモリアドレスにロードするための明示的な指示がある可能性が高い」:これは、binファイル生成プロセスが特定のアドレスにデータをロードするための追加コードを追加することを意味しますか?
Penghe Geng 2014

1
私が学んだ限り、binファイルはプログラムをオフセット0から実行するようなものであり、データセグメントが埋め込まれています。これが間違っている場合は修正してください。
Martin Kersten、2015

@MartinKersten正しい、ビンのファイルは、オフセット0からスタート
t0mm13b

1
@ t0mm13bしたがって、通常の.hexファイルと同じように.elfファイルをマイクロコントローラーに書き込むことができますが、フラッシュメモリの消費量が多く、マイクロがリセットされるたびに、セクションは変更に対処しますか?
Aelgawad

@BlackyDucky、それが可能だとは思わない。マイクロコントローラーがELFデータを直接実行しようとすると、ヘッダーやその他のデータが命令として誤って解釈されますよね?
iX3

40

binファイルは、プログラムを実行するROMまたは特定のアドレスに入るビットとバイトです。このデータを取得してそのまま直接読み込むことができますが、ベースアドレスは通常そこにはないため、ベースアドレスを知る必要があります。

elfファイルにはビン情報が含まれていますが、他の多くの情報、可能なデバッグ情報、シンボルに囲まれているため、バイナリ内のデータとコードを区別できます。バイナリデータの複数のチャンクを許可します(これらのいずれかをビンにダンプすると、次のブロックに埋め込むためのフィルデータを含む1つの大きなbinファイルが得られます)。バイナリの量と、ゼロに初期化したいbssデータの量を示します(gnuツールには、binファイルを正しく作成する際に問題があります)。

elfファイル形式は標準であり、armはその拡張/バリエーションを標準で公開しています。誰もがそこに何があるかを理解するためにelf解析プログラムを書くことをお勧めします。ライブラリを気にしないでください。仕様の情報と構造を使用するだけで非常に簡単です。一般に.binファイルを作成するだけでなく、binやelfの出力を台無しにするのに役立つリンカースクリプトやその他のデバッグを行うことで、gnuの問題を克服するのに役立ちます。


1
0x7C00は、必ずしもelfを使用しないブートローダーのように聞こえます。これは一般的な質問です。オペレーティングシステムには(仮想)アドレススペースのルールがあり、ツールチェーンはそのオペレーティングシステムのルールをターゲットにする必要があります。ファイル形式は、アドレスとロードされたエントリポイントなどのロード可能なアイテムを示します。elfは単なる箱のようなコンテナーです。対象とするユースケースに合わせて適切に梱包する必要があります。
old_timer

1
ASCIIをVGAに出力する場合は、データを含むプログラムを作成するか、その場でデータを数学的に生成するか、その組み合わせをオペレーティングシステムで定義されたコードスペースにロードして実行します。それ。通常、物理的な周辺機器にデータを押し込むことはありません。それは、とにかくそれを実行したり、ローダーにそれを実行させたりすることのできるまれなオペレーティングシステムです。
old_timer

1
ベアメタルの場合、特にこのelfファイルがブートローダーまたは最初のプログラム実行である場合は、フラッシュをプログラムするツール(openocd overなど)への足がかりとしてelfファイルを使用するため、エントリポイントと_startは関係ありません。 jtag)またはwhatwhat-whatever-objcopy -O binary file.elf file.binを介して、そのファイルが何らかの方法でフラッシュにロードされます。x86でブートローダーを試してみましたが、BIOSがelfファイルを解析できないため、メモリイメージでもあると想定しています。したがって、-Oバイナリタイプのbinファイル
old_timer

1
別のエンティティは、ハードウェア/ロジックまたはその他のデザインです。オペレーティングシステムの場合、オペレーティングシステムがルールを作成し、マイクロコントローラの場合、チップ/プロセッサのデザインがルールを作成します。たとえば、ベクターテーブルがあり、ベクターがハンドラーをポイントしている場合、そのすべてをリンカースクリプトにロールバックする必要があります。これにより、読み込み可能なデータが、起動するフラッシュに送信されるようになります。
old_timer

1
ターゲットにオペレーティングシステム、プロセッサ、マルチステージブートローダーなどのルールがあることを広げるには、これらのルールに基づいて「バイナリ」を構築する必要があります。ブートストラップとリンカースクリプトが最も重要です。次に、各ターゲット、そのバイナリの適用方法、サポートされているファイル形式について非常に幅広く説明します。多くのホスト開発プラットフォーム上のgnuがelfファイル形式がデフォルトの出力であると想定し、必要に応じてツール(ターゲット固有のユーティリティ/ローダーの場合)を使用して、elfから他の何かに抽出または変換します。
old_timer

30

いくつかのリソース:

  1. ARMアーキテクチャのELF
    http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf
  2. wiki http://en.wikipedia.org/wiki/Executable_and_Linkable_Formatの ELF

ELF形式は通常、コンパイルのデフォルトの出力です。GNUツールチェーンを使用している場合、次のようなobjcopyを使用してバイナリ形式に変換できます。

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

またはfromELFユーティリティの使用(ただし、ADSなどのほとんどのIDEに組み込まれています):

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

6
これは、binファイルの詳細が答えた後に追加された、とアドオン実際に有用な技術。+1。
erbdex

-1

ここでポイントを訂正したいだけです。ELFファイルは、コンパイラーではなくリンカーによって生成されます。

コンパイラの使命は、ソースコードファイルからオブジェクトファイル(* .o)を生成した後に終了します。リンカーは、すべての.oファイルをリンクして、ELFを生成します。


質問への回答ではなく、必ずしも正しいわけでもないため、反対票が投じられました。大まかに定義すると、コンパイルにはリンクが含まれます。ldドキュメントから引用:通常、プログラムをコンパイルする最後のステップは、ldを実行することです。
bzeaman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.