实现 ELF 可执行文件和调试符号表分离

@2010-07-08 新版功能: 创建

记得好久以前看到 RedHat 的 rpm 都有个 debuginfo 的对应rpm,也就是可执行文件没有 调试符号表,但安装 debuginfo 的 rpm 后可以看到调试信息。 当时没搞明白是怎么做的,后来就不了了之了。

前不久在 Gentoo 里看到 FEATURES 里加个 splitdebug 可以实现同样的效果, 正好我们可能有类似的需求,于是研究了一下,其实很简单的几个命令:

$ gcc -g test.c -o test
$ objcopy --only-keep-debug test test.debug
$ objcopy --add-gnu-debuglink=test.debug test
$ stip -s test
$ gdb ./test
...
Reading symbols from /home/liuzx/test...Reading symbols from /home/liuzx/test.debug...done.
(no debugging symbols found)...done.
(gdb) list
1 #include <stdio.h>
2
3 int main()
4 {
5     printf("Hello.\n");
6
7     return 0;
8 }
(gdb) q
$ file test
test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped