コンパイル済みのバイナリファイルを調べるとき、hexdumpreadelf でELFフォーマットを見るのは、ちょっとした発掘作業みたいなものだ。情報はあるけど、ぎっしりと詰まった数字と記号の羅列で、目が疲れる。

そこで見つけたのが elfcat

これは何

elfcatはRustで書かれたELF可視化ツール。やることはシンプル:ELF形式のバイナリファイルを入力すると、HTMLページを出力する。ただのダンプじゃなくて、ELFの各セクション、セグメント、シンボルテーブル、リロケーションエントリなどを折りたたみ可能でジャンプできるインタラクティブな構造に整理してくれる。

GitHub: https://github.com/rbakbashev/elfcat
Stars: 990

実際の使い勝手

例えば、シンプルなCプログラムをコンパイルしたとする:

$ elfcat a.out -o a.html

a.html を開くと、こんなのが見える:

  • ファイルヘッダ情報:マジックナンバー、アーキテクチャ、エントリポイントアドレスが一目瞭然
  • Program Headers:各セグメントのタイプ、オフセット、仮想アドレス、権限フラグ。ロードセグメントと動的リンクセグメントが色分けされている
  • Section Headers.text.data.bss.rodata など、各セクションのサイズと属性が明確に表示
  • ヘキサデシマルビュー:生バイトの横にASCIIデコードが表示され、セクションをクリックすると対応する位置にジャンプ

一番実用的なのは、異なるセクションが異なる色でマークされる点だ。コードセグメントは青、データセグメントは緑、読み取り専用データは黄色。ファイルのメモリレイアウトが一目でわかる。

どんなときに使うか

正直なところ、日常の開発では必要ないかもしれない。でもこういう場面では役に立つ:

リンク問題のデバッグ
コンパイル後のプログラムサイズが異常に大きい、またはリンク時に謎のエラーが出る。elfcatで開いて、セクションが重複してインポートされていないか、動的リンクの依存関係が間違っていないか確認する。

ELFフォーマットの学習
『Linkers and Loaders』や『プログラマーのためのプロセス・メモリ・実行ファイルの仕組み』のような本を読んでいるなら、elfcatで理論と実際のファイルを対応させられる。本の構造図と実際のバイナリを見比べると、理解が格段に早まる。

怪しいファイルの分析
出所不明のバイナリファイルを手に入れて、何をするものか素早く知りたい。elfcatならどの動的ライブラリに依存しているか、パックされているか、セクション名が難読化されていないかがわかる。

組み込み開発
リソース制約の厳しい環境で、各セクションをメモリのどの位置に配置するか精密に制御する必要がある。elfcatが生成する可視化レポートはチームで共有できるし、hex dumpのスクリーンショットよりずっと分かりやすい。

類似ツールとの比較

ツール出力形式インタラクティブ性用途
readelfターミナルテキストなしクイックビュー、スクリプト処理
objdumpターミナルテキストなし逆アセンブル、詳細分析
elfcatHTML高い可視化、チーム共有、学習
Binary NinjaGUI高いリバースエンジニアリング、専門的分析

elfcatのポジショニングは明確だ。コマンドラインツールより直感的で、専門の逆コンパイラより軽量。しかも生成されるHTMLは純粋な静的ファイルなので、オフラインでも閲覧でき、同僚に直接送れる。

インストール

プリコンパイル済みのバイナリがあるし、cargoから直接インストールもできる:

cargo install elfcat

依存関係が少なく、コンパイルも速い。

まとめ

elfcatはワークフローを変えるような神ツールじゃない。でも「このバイナリファイルがどんな構造になってるか素早く知りたい」という場面ではうまく機能する。990のスターは、同じ悩みを持つ人が相当数いることを示している。バイナリファイルはブラックボックスであるべきじゃない、少なくとも学習段階では。

コンパイル済みのファイルを頻繁に扱う人や、OSやコンパイラの原理を学んでいる人は、elfcatを試してみてほしい。退屈なバイナリをクリックできるウェブページに変換する体験は、なかなか面白い。