关于 elf-inspection
elf-inspection 是一项面向 Agent 的 Linux ELF 二进制检查技能,可用于分析符号、节、动态链接和调试信息,并排查链接及二进制体积问题。
主要功能
- 01查看 ELF 头部与节布局
- 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 检查
用途
指导 Agent 检查 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。
相关技能
- 使用
skills/binaries/linkers-lto了解链接器标志和 LTO - 使用
skills/binaries/binutils了解ar、strip、objcopy、addr2line - 使用
skills/debuggers/core-dumps了解构建 ID 和 debuginfod 的用法
评论
支持 Markdown