elf-inspection について
elf-inspection は、Linux の ELF バイナリを調べるエージェント向けスキルです。シンボル、セクション、動的リンク、デバッグ情報を扱い、リンクの問題やバイナリサイズの調査を案内します。
主な機能
- 01ELF ヘッダーとセクションの確認
- 02動的依存関係とシンボルの確認
- 03デバッグ情報と再配置の調査
- 04ソースを交えた逆アセンブル
- 05ハードニングとバイナリサイズの確認
活用シーン
- 01実行時の未定義シンボルの診断
- 02不足している共有ライブラリの特定
- 03デバッグ情報の有無の確認
- 04バイナリサイズやハードニングの分析
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill elf-inspectionインストール後、Claude Code で/elf-inspectionを入力して読み込まれたか確認します。
同梱ファイルreferences/cheatsheet.md
詳細
ELF の検査
目的
Linux の ELF バイナリを検査する方法として、シンボルテーブル、セクションのレイアウト、動的リンク、デバッグ情報、およびリンカーエラーの診断についてエージェントを案内します。
トリガー
- 「このバイナリが依存しているライブラリは何ですか?」
- 「このバイナリのサイズが大きいのはなぜですか?」
- 「
undefined referenceまたは実行時のシンボル未検出が発生しています」 - 「このバイナリにデバッグ情報が含まれているか確認するにはどうすればよいですか?」
- 「ライブラリがエクスポートしているシンボルを調べるにはどうすればよいですか?」
- 「バイナリが PIE か、RELRO が有効かを確認するにはどうすればよいですか?」
ワークフロー
1. 概要をすばやく確認する:file と size
file prog # type, arch, linkage, stripped or not
size prog # section sizes: text, data, bss
size --format=sysv prog # detailed per-section breakdown
2. 動的依存関係:ldd
ldd ./prog # show all shared lib dependencies
ldd -v ./prog # verbose: include symbol versions
# Check why a library is loaded
ldd ./prog | grep libssl
# For a library (not an executable)
ldd ./libfoo.so
ldd に not found と表示される場合、共有ライブラリが LD_LIBRARY_PATH または /etc/ld.so.conf に指定されていません。
修正方法:
export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH
# Or install the library and run ldconfig
sudo ldconfig
3. シンボル:nm
nm prog # all symbols (T=text, D=data, U=undefined, etc.)
nm -D ./libfoo.so # dynamic symbols only
nm -C prog # demangle C++ symbols
nm --defined-only prog # only defined symbols
nm -u prog # only undefined (needed) symbols
nm -S prog # include symbol size
# Search for a symbol
nm -D /usr/lib/libssl.so | grep SSL_read
シンボルの種類を示すコード:
T/t— テキスト(コード):グローバル/ローカルD/d— データ(初期化済み):グローバル/ローカルB/b— BSS(未初期化):グローバル/ローカルR/r— 読み取り専用データ:グローバル/ローカルU— 未定義(リンク時に提供される必要があります)W/w— 弱シンボル
4. セクション:readelf
readelf -h prog # ELF header (arch, type, entry point)
readelf -S prog # all sections
readelf -l prog # program headers (segments)
readelf -d prog # dynamic section (like ldd but raw)
readelf -s prog # symbol table
readelf -r prog # relocations
readelf -n prog # notes (build ID, ABI tag)
readelf --debug-dump=info prog | head -100 # DWARF info
readelf -a prog # all of the above
5. 逆アセンブルとソース:objdump
# Disassemble all code sections
objdump -d prog
objdump -d -M intel prog # Intel syntax
# Disassemble + intermix source (needs -g at compile time)
objdump -d -S prog
# Disassemble specific symbol
objdump -d prog | awk '/^[0-9a-f]+ <main>:/,/^$/'
# All sections (including data)
objdump -D prog
# Header info
objdump -f prog
objdump -p prog # private headers (including needed libs)
6. バイナリの強化チェック
# Check for PIE, RELRO, stack canary, NX
# Use checksec (install separately)
checksec --file=prog
# Manual checks:
readelf -h prog | grep Type # ET_DYN = PIE, ET_EXEC = non-PIE
readelf -d prog | grep GNU_RELRO # RELRO present
readelf -d prog | grep BIND_NOW # full RELRO
readelf -s prog | grep __stack_chk # stack protector
readelf -l prog | grep GNU_STACK # NX bit (RW = no exec, RWE = exec stack)
7. セクションサイズの分析(バイナリの肥大化)
# Detailed section sizes
size --format=sysv prog | sort -k2 -nr | head -20
# Per-object contribution (with -Wl,--print-map or bloaty)
# Bloaty (install separately): https://github.com/google/bloaty
bloaty prog
# Check stripped vs not
file prog
strip --strip-all -o prog.stripped prog
ls -lh prog prog.stripped
8. ビルド ID
ビルド ID はバイナリ/ライブラリのビルドを一意に識別し、debuginfod による検索を可能にします。
readelf -n prog | grep 'Build ID'
# or
file prog | grep BuildID
9. 一般的な診断フロー
「実行時に未定義シンボルが発生する」
# Which library was expected to provide it?
nm -D libfoo.so | grep mysymbol
# Is the library in the runtime path?
ldd ./prog | grep libfoo
# Check LD_PRELOAD / LD_LIBRARY_PATH
「バイナリのサイズが大きすぎる」
size --format=sysv prog | sort -k2 -nr | head
nm -S --defined-only prog | sort -k2 -nr | head -20
objdump -d prog | awk '/^[0-9a-f]+ </{fn=$2} /^[0-9a-f]/{count[fn]++} END{for(f in count) print count[f], f}' | sort -nr | head -20
クイックリファレンスについては、references/cheatsheet.md を参照してください。
関連スキル
- リンカーフラグと LTO については
skills/binaries/linkers-ltoを使用します ar、strip、objcopy、addr2lineについてはskills/binaries/binutilsを使用します- ビルド ID と debuginfod の使用については
skills/debuggers/core-dumpsを使用します
コメント
Markdown 対応