コンパイラーによって生成される最終的なイメージには、binファイルと拡張ローダー形式のELfファイルの両方が含まれます。これら2つの違いは何ですか(特にELFファイルのユーティリティ)。
コンパイラーによって生成される最終的なイメージには、binファイルと拡張ローダー形式のELfファイルの両方が含まれます。これら2つの違いは何ですか(特にELFファイルのユーティリティ)。
回答:
Binファイルは、メモリの修正や再配置を行わない純粋なバイナリファイルであり、特定のメモリアドレスにロードする明示的な命令が含まれている可能性が高いです。ところが……。
ELFファイルは、シンボルルックアップと再配置可能テーブルで構成される実行可能リンク可能形式です。つまり、カーネルによって任意のメモリアドレスにロードでき、使用されるすべてのシンボルは、そのメモリアドレスからのオフセットに自動的に調整されます。に読み込まれました。通常、ELFファイルには「データ」、「テキスト」、「bss」などのセクションがいくつかありますが、いくつかのセクション内にあり、ランタイムがシンボルのメモリ参照を調整する場所を計算できるセクションにあります実行時に動的に。
binファイルは、プログラムを実行するROMまたは特定のアドレスに入るビットとバイトです。このデータを取得してそのまま直接読み込むことができますが、ベースアドレスは通常そこにはないため、ベースアドレスを知る必要があります。
elfファイルにはビン情報が含まれていますが、他の多くの情報、可能なデバッグ情報、シンボルに囲まれているため、バイナリ内のデータとコードを区別できます。バイナリデータの複数のチャンクを許可します(これらのいずれかをビンにダンプすると、次のブロックに埋め込むためのフィルデータを含む1つの大きなbinファイルが得られます)。バイナリの量と、ゼロに初期化したいbssデータの量を示します(gnuツールには、binファイルを正しく作成する際に問題があります)。
elfファイル形式は標準であり、armはその拡張/バリエーションを標準で公開しています。誰もがそこに何があるかを理解するためにelf解析プログラムを書くことをお勧めします。ライブラリを気にしないでください。仕様の情報と構造を使用するだけで非常に簡単です。一般に.binファイルを作成するだけでなく、binやelfの出力を台無しにするのに役立つリンカースクリプトやその他のデバッグを行うことで、gnuの問題を克服するのに役立ちます。
いくつかのリソース:
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]
NOP
を含まないファイルをコンパイルすると、400バイトのELFコンテナではなく、1バイトにコンパイルされます。つまり、生のコードだけで、コンテナのメタデータはありません。NASMによると、これは主にMS-DOS .COMおよび.SYSファイルに使用されます。ディレクティブはほとんど無視され、アライメントのみが生成されます。-f
-fbin
0x90
-felf32
section