コース目次 / 第3章

readelfで、ELFヘッダーを読む

readelf -hでELFヘッダーの主要項目(Class・Type・Machine・Entry point)を読み、OSがバイナリを実行する際にまず何を確認しているかを理解します。

第3章 / 全5章目安 約10分この章のゴール: readelf -hの主要項目を読み、その意味を説明できるようになる

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章です。

この章はまだ完了していません。