我有一些编译的库,即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