我有一个静态库,它是用"-g "标志编译的对象文件建立的。我把这个静态库的调试信息分离到一个单独的文件中,比如.NET Framework 2.0。objcopy --only-keep-debug lib_mylib.o lib_mylib.o.debug
然后将我的应用程序与这个静态库连接起来(在剥离了调试信息之后),如以下所示 gcc -g driver.c -o driver -L. -l_mylib
谁能指导我如何从静态库中加载调试信息?lib_mylib.o.debug
在我的应用程序中,当我试图通过add-symbol-file命令加载静态库时,我在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
它将自动完成所有的事情。