【问题标题】:How to know the given shared library is built with debug symbols or not?如何知道给定的共享库是否使用调试符号构建?
【发布时间】:2013-12-07 09:33:29
【问题描述】:

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

如何检查?

【问题讨论】:

标签: linux debugging shared-libraries debug-symbols


【解决方案1】:

请注意,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

【讨论】:

  • 这应该是正确答案,并补充说明什么是剥离。
【解决方案2】:

您可以使用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 的说明。如果您想在没有符号的情况下交付一些东西,但随后能够在转储的紧要关头对其进行调试,这将很有帮助。

【讨论】:

  • 我可以看到 libQt5Gui.so.5.5.1 在不同的文件 libQt5Gui.so.5.5.1.debug 中有调试符号,但文件命令显示没有为 libQt5Gui.so.5.5.1 剥离
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2017-04-06
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多