如何知道给定的共享库是使用debugging符号还是不使用?

我有一些编译的库,即x86 Linux上的共享库(ie * .so),我想快速确定它们是否使用debugging符号(即带有选项-g / debug build)进行编译。

如何检查?

您可以使用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将共享对象本身的调试符号分开。 这将提取另一个文件中的符号,然后你需要知道链接,让他们回来。 你可以看到用gdb使用build-id 来做这个的说明。 如果你想提供一些没有符号的东西,那么这是有帮助的,但是可以通过转储来调试它。

请注意, 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-go gcc -g -shared -o libmyshared-g.so myshared-go 

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 ld .debug_aranges 0000000000000000 .debug_aranges 0000000000000000 ld .debug_info 0000000000000000 .debug_info 0000000000000000 ld .debug_abbrev 0000000000000000 .debug_abbrev 0000000000000000 ld .debug_line 0000000000000000 .debug_line 0000000000000000 ld .debug_str 0000000000000000 .debug_str