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

如何从C静态库中分离调试符号,然后将其加载到GDB中,c,debugging,gdb,static-libraries,C,Debugging,Gdb,Static Libraries,我有一个静态库,它是用带有“-g”标志的对象文件编译而成的。我将此静态库的调试信息分离到一个单独的文件中,例如: objcopy——只保留debug lib_mylib.o lib_mylib.o.debug 然后将我的应用程序链接到这个静态库(在从中剥离调试信息之后),作为gcc-g driver.c-o driver-L-L_mylib 有人能指导我如何将调试信息从静态库从lib_mylib.o.debug加载到GDB中,以便调试应用程序中静态库提供的代码吗? 当试图通过添加符号文件命令加载

我有一个静态库,它是用带有“-g”标志的对象文件编译而成的。我将此静态库的调试信息分离到一个单独的文件中,例如:
objcopy——只保留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

有了上述功能,您不需要添加符号文件,只需将GDB指向驱动程序dbg,它就会自动执行所有操作。

乍一看,您的
lib_mylib.o
中已经编译了调试符号,因此当您
-l_mylib
时,这些符号应该包含在最终程序中。还是从
lib_mylib.o
中删除了它们?@MarcoBonelli我从静态库中删除了调试符号<代码>strip-g lib_mylib.a在与应用程序链接之前。虽然上述内容有意义,但我的用例是将我的可执行文件与静态库的剥离版本链接,并根据需要调试应用程序。但是,每当需要调试应用程序中使用的静态库代码时,我都可以加载静态库的调试符号并继续。@sbunny“我可以加载静态库的调试符号并继续”——我已经告诉了您具体的操作方法。非常感谢。一般来说,有没有一种好方法可以将静态库(由大量对象文件组成)的调试信息单独发送给库本身,就像Linux共享库的调试信息包一样。@sbunny除了发送整个非压缩库之外,我不知道还有什么好方法。这似乎也是一个人为设计的用例:为什么在自动执行(通过使用未剥离的可执行文件)时手动执行同样简单?