- 1 What is the difference between elfutils and binutils
- 2 eu-stack vs gdb
- 3 eu-strip vs strip
- 4 eu-addr2line vs addr2line
1 What is the difference between elfutils and binutils
根据维基百科的介绍,elfutils 被描述为“Ulrich Drepper 编写了 elfutils,以取代 GNU Binutils,专门为 Linux 开发,并仅支持 ELF 和 DWARF 格式”。
elfutils 是一个红帽项目。
elfutils(如 eu-addr2line、eu-elflint、eu-findtextrel、eu-nm、eu-readelf、eu-size、eu-strip 等)与 binutils(addr2line、nm、readelf、size、strip、objdump 等)有相当大的重叠。
elfutils 的作者 Ulrich Drepper 提到了以下差异,
- 与 binutils 相比,elfutils 工具
- 体积更小
- 速度更快(通常是数倍)
- 更少的错误
- 功能更丰富
- 一些 binutils 中没有的工具被广泛使用
- 还有一些工具使用了 elfutils 库(如 systemtap、frysk 等)
2 eu-stack vs gdb
eu-stack
仅用作显示可执行文件或者 core 文件的堆栈,速度非常快。 gdb 是一个完整的调试器,速度相对慢。
3 eu-strip vs strip
eu-strip
比 strip
更灵活,可以将抽符号表与将符号表保存一步完成:
eu-strip a.out -f a.debug
以上命令将 a.out 中的符号表段和调试信息段都移出到 a.debug 文件中。这样,a.out 的 size 会减小很多。
而此时,a.out 中会多一个 .gnu_debuglink
段,它是用来保存符号表位置的。
之后,再用 gdb 去打开并运行 a.out 时,gdb 还可以找到 a.debug 这样的符号表及调试信息文件。
使用 strip
也能完成同样的任务,但是需要配合名 objcopy
命令,需要多个步骤完成:
# test.debug 将包含调试信息和符号表; 而test将只包含调试信息
objcopy --only-keep-debug test test.debug
# 从test文件里剥离debug段
objcopy --strip-debug test
# 更彻底地,上面这句可以换成下面这句以移除所有的debug信息和符号表
strip -s test
# 在二进制文件 test 中添加 .gnu_debuglink 段以指向符号表和调试信息文件
objcopy --add-gnu-debuglink=test.debug test
# objdump 命令可以查看指定的section
objdump -s -j .gnu_debuglink test
4 eu-addr2line vs addr2line
前者速度飞快。。。