我有一个静态库,它是用带有“-g”标志编译的目标文件构建的。我将这个静态库的调试信息分离到一个单独的文件中,例如:
objcopy --only-keep-debug lib_mylib.o lib_mylib.o.debug
然后将我的应用程序与此静态库链接(从中删除调试信息后)作为 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
不变,并在链接时从可执行文件中去除调试符号:
gcc -g driver.c -o driver -L. -l_mylib -Wl,-s
更简单的是:将二进制文件与调试信息链接起来并保留它用于调试,但在需要剥离的地方使用剥离的可执行文件:
gcc -g driver.c -o driver-dbg -L. -l_mylib &&
strip -g -o driver driver-dbg
有了上面,你不需要add-symbol-file
,只需将GDB指向driver-dbg
,它会自动完成所有事情。
关于c - 如何从 C 静态库中分离调试符号,然后将其加载到 GDB 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61501705/