如何简便列出ELF文件中每个目标文件对应的所有函数
ELF文件按目标文件分组列出所有函数的实现方法
你可以通过nm和awk组合直接实现需求,不需要额外安装工具:
直接可用命令
把下方命令中的<your_elf_file>替换为实际ELF文件路径即可运行:
nm -A <your_elf_file> | awk '/ [Tt] / {split($1,a,":"); if (a[1]!= last) {print "\n"a[1]":"; last=a[1]}; print $3}'
命令说明
-A参数让nm输出每条符号前都附带所属的目标文件名- 正则
/ [Tt] /仅筛选文本段的函数符号:大写T对应全局函数,小写t对应静态函数,如有需要可以调整匹配规则包含弱符号等其他类型函数 - awk部分负责将结果按目标文件分组整理,输出格式完全符合你的要求
封装为自定义命令
如果要达到你期望的tool [params] elf_file使用方式,可以把上述命令封装为别名:
- 编辑
~/.bashrc(或你所用shell的配置文件),添加以下内容:
elf-list-func() { nm -A "$1" | awk '/ [Tt] / {split($1,a,":"); if (a[1]!= last) {print "\n"a[1]":"; last=a[1]}; print $3}' }
- 执行
source ~/.bashrc生效后,就可以直接调用:
elf-list-func your_elf_file
补充说明
如果需要排除未定义的外部引用函数,可以用readelf组合的方案,筛选更精准:
readelf -s <your_elf_file> | awk 'NF>7 && $7!="UND" && $4=="FUNC" {split($NF,a,":"); if (a[1]!= last) {print "\n"a[1]":"; last=a[1]}; print a[2]}'
注意:如果你的ELF文件已经被strip过,丢失了符号表和编译单元信息,上述方法均无法生效,需要用反汇编工具做函数识别。
内容的提问来源于stack exchange,提问作者Ahelion
相关产品推荐
相关产品推荐

