如何从 C 静态库中分离调试符号,然后将其加载到 GDB 中

How to separate debug symbols from a C static library and later load it in GDB

我有一个静态库,它是用使用“-g”标志编译的目标文件构建的。我将这个静态库的调试信息分离到一个单独的文件中,例如: objcopy --only-keep-debug lib_mylib.o lib_mylib.o.debug

然后 link 我的应用程序使用这个静态库(从中删除调试信息后)作为 gcc -g driver.c -o driver -L. -l_mylib

有人可以指导我如何将静态库中的调试信息从 lib_mylib.o.debug 加载到 GDB 中,以便我可以在我的应用程序中调试由静态库提供的代码吗? 尝试通过添加符号文件命令加载 GDB 时出现以下错误:

(gdb) add-symbol-file lib_mylib.a.debug 0x0
add symbol table from file "lib_mylib.a.debug" at
    .text_addr = 0x0
(y or n) y
`/home/sbunny/tmp/static-lib/lib_mylib.a.debug': can't read symbols: File format not recognized.

不要这样做:

objcopy --only-keep-debug lib_mylib.o lib_mylib.o.debug

(仅适用于共享库。)

改为这样做:

cp lib_mylib.o lib_mylib.o.debug

更简单的方法可能是保持 lib_mylib.o 不变,并在 link 时间从可执行文件中删除调试符号:

gcc -g driver.c -o driver -L. -l_mylib -Wl,-s

更简单:link 带有调试信息的二进制文件并保留它用于调试,但在需要剥离的地方使用剥离的可执行文件:

gcc -g driver.c -o driver-dbg -L. -l_mylib &&
strip -g -o driver driver-dbg

有了上面的内容,您就不需要 add-symbol-file,只需将 GDB 指向 driver-dbg,它就会自动完成所有操作。