萌えハッカーニュースリーダー

2025/05/30 02:17 The ELF: What the ARM Assembler Generates on Raspberry Pi

出典: https://embeddedjourneys.com/blog/hello-world-arm-assember-generates-elf-raspberry-pi/
hakase
博士

やあ、ロボ子!今日はRaspberry PiのARMアセンブリで生成されたバイナリオブジェクトファイルを解析するのじゃ!

roboko
ロボ子

博士、よろしくお願いします!ELFの構造を手動で解剖するんですね。なんだかワクワクします!

hakase
博士

そう、まずはELFヘッダーから見ていくぞ。これはオブジェクトファイルの解釈方法に関するメタデータが詰まっている、宝箱みたいなものじゃ!

roboko
ロボ子

ELFヘッダーには、マジックナンバーとか、エンディアンとか、色々な情報が入っているんですよね。

hakase
博士

その通り!最初の4バイトはマジックナンバーで「0x7F 0x45 0x4C 0x46」。0x45 0x4C 0x46はASCIIコードでELFを表しているのがおしゃれじゃな。

roboko
ロボ子

へえー!5バイト目のEI_CLASSは0x01で32ビットオブジェクト、6バイト目のEI_DATAは0x01でリトルエンディアンを示すんですね。

hakase
博士

そうじゃ。そして、e_typeは0x00 0x01 (ET_REL = relocatable file)、e_machineは0x00 0x28 (EM_ARM = Advanced RISC Machines ARM)じゃ。

roboko
ロボ子

ARMアーキテクチャだってことが一目でわかるんですね!

hakase
博士

次にセクションヘッダーテーブルじゃ。これは各セクションの情報が詰まっている、地図みたいなものじゃな。

roboko
ロボ子

セクションヘッダーテーブルは、ELFヘッダーのe_shoff、e_shnum、e_shentsizeを使って位置とサイズを特定するんですね。

hakase
博士

エントリー1の.textセクションを見てみよう。sh_nameは文字列テーブルのインデックス31にある".text"という名前じゃ。プログラムのコードがここに入っているぞ。

roboko
ロボ子

sh_typeはSHT_PROGBITSで、プログラム定義の情報を持つセクションなんですね。sh_flagsにはSHF_ALLOCとSHF_EXECINSTRが設定されているから、実行時にメモリを占有して、実行可能な機械語命令を含む、と。

hakase
博士

エントリー2の.rel.textは再配置情報じゃな。sh_typeはSHT_RELで、明示的な加数を持たない再配置エントリーを示すぞ。

roboko
ロボ子

再配置情報って、プログラムがメモリのどこに配置されるかに依存する情報を修正するためのものですよね。

hakase
博士

その通り!そして、.strtabセクションはシンボルテーブルエントリーに関連付けられた名前を保持しているんじゃ。

roboko
ロボ子

.shstrtabセクションはセクションヘッダー名文字列テーブルで、セクションヘッダーテーブルで使用されるセクション名を保持するんですね。

hakase
博士

最後に、readelfコマンドを使うと、手動で解析した内容が正しいか検証できるぞ。

roboko
ロボ子

なるほど!今後は、アセンブラ命令がビット単位の表現にどのように変換されるか、.textセクションについてより深く理解したいです。

hakase
博士

GNUリンカとGNUデバッガがこれらのバイナリファイルをどのように変更するかも調べると面白いぞ。ところでロボ子、ELFファイルって、エルフが作ったファイルって意味だと思う?

roboko
ロボ子

博士、それはさすがに…!Executable and Linkable Formatの略ですよ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search