【发布时间】:2013-12-07 09:33:29
【问题描述】:
我有一些编译库,即 x86 Linux 上的共享库 (*.so),我想快速确定它们是否使用调试符号(即使用 -g/debug 选项)编译.
如何检查?
【问题讨论】:
-
objdump 文件名-x | grep '调试'
标签: linux debugging shared-libraries debug-symbols
我有一些编译库,即 x86 Linux 上的共享库 (*.so),我想快速确定它们是否使用调试符号(即使用 -g/debug 选项)编译.
如何检查?
【问题讨论】:
标签: linux debugging shared-libraries debug-symbols
请注意,not stripped 并不意味着调试符号。
库代码:
//myshared.c
#include <stdio.h>
void print_from_lib()
{
printf("Printed from shared library\n");
}
使用和不使用调试标志进行编译:
gcc -c -Wall -Werror -fpic myshared.c
gcc -shared -o libmyshared.so myshared.o
gcc -g -c -Wall -Werror -fpic myshared.c -o myshared-g.o
gcc -g -shared -o libmyshared-g.so myshared-g.o
检查file
$ file libmyshared.so
libmyshared.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=1ad3b94d5c8a7392c2140a647254753221a152cd, not stripped
$ file libmyshared-g.so
libmyshared-g.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0268eaf97e5a670d2f7e767a011be6f06a83090a, not stripped
两者都声称他们没有被剥夺。但是只有libmyshared-g.so 显示符号:
$ objdump --syms libmyshared.so | grep debug
$ objdump --syms libmyshared-g.so | grep debug
0000000000000000 l d .debug_aranges 0000000000000000 .debug_aranges
0000000000000000 l d .debug_info 0000000000000000 .debug_info
0000000000000000 l d .debug_abbrev 0000000000000000 .debug_abbrev
0000000000000000 l d .debug_line 0000000000000000 .debug_line
0000000000000000 l d .debug_str 0000000000000000 .debug_str
【讨论】:
您可以使用file 命令查看文件是否为stripped。基本上,这意味着调试符号是否存在。
这是我系统中的一个文件:
$ file libjsd.so
libjsd.so: ELF 32-bit LSB shared object, \
Intel 80386, version 1 (SYSV), dynamically linked,
stripped
注意被剥离。
这是我编译的:
$ file libprofile_rt.so
libprofile_rt.so: ELF 64-bit LSB shared object, x86-64,
version 1 (SYSV), dynamically linked,
BuildID[sha1]=0x..., not stripped
看到“未剥离”,表示它有调试符号。
还可以使用objcopy 将调试符号与共享对象本身分开。这将在另一个文件中提取符号,然后您需要知道链接才能将它们取回。您可以使用 build-ids 查看doing this with gdb 的说明。如果您想在没有符号的情况下交付一些东西,但随后能够在转储的紧要关头对其进行调试,这将很有帮助。
【讨论】: