コース目次 / 第3章
readelfで、ELFヘッダーを読む
readelf -hでELFヘッダーの主要項目(Class・Type・Machine・Entry point)を読み、OSがバイナリを実行する際にまず何を確認しているかを理解します。
od で見た先頭16バイトの、その先には何があるのでしょうか。readelfを使えば、バイト列を自分で数えなくても、意味づけされた形で読めます。
readelf -hで、ヘッダーを読む
readelf -h hello
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Position-Independent Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x1060
Start of program headers: 64 (bytes into file)
Start of section headers: 13976 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 13
Size of section headers: 64 (bytes)
Number of section headers: 31
Section header string table index: 30
主要項目を、読み解く
Magic — 前章で見た7f 45 4c 46そのものです。odで1バイトずつ数えていたものを、readelfは「Magic」という項目名を付けて見せてくれます。
Class — ELF64。32bit版か64bit版かの区別です。
Type — DYN(共有オブジェクト/位置独立実行ファイル)。最近のLinuxは、通常の実行ファイルもセキュリティのため位置独立(PIE)でビルドします——sec-cで見たASLRと関係します。
Machine — Advanced Micro Devices X86-64。どのCPUアーキテクチャ向けにビルドされたかです。ARM向けにビルドされたバイナリをx86_64のPCで実行しようとすると、ここが合わずに失敗します。
Entry point address — 0x1060。OSがこのプログラムを実行するとき、最初にジャンプする命令のアドレスです。
ELFヘッダーは、OSにとっての「実行の地図」です。「これは実行可能なファイルか」「どのCPU向けか」「どこから実行を始めればよいか」——プログラムを動かす前に、OSはまずこの数十バイトのヘッダーを読んで判断しています。readelf -hは、その判断材料を人間が読める形に翻訳してくれるだけです。
持ち帰る一言
ELFヘッダーは、OSが最初に読む地図。 Class・Type・Machine・Entry pointの4つを覚えておけば、readelf -hの出力の大部分は読めるようになります。次でこのコースをまとめます。
こうなっていればOK
卒業まであと1章です。
この章はまだ完了していません。
保存できませんでした(プライベートブラウズ中かもしれません)。この端末に進捗は残りませんが、先へは進めます。