如何告诉gcc(或ld)链接标准c和c ++库的调试版本

时间:2010-07-02 00:10:50

标签: debugging gcc linker compilation

我有libstdc ++和libc等调试版本,并希望链接它们。它们位于/ usr / lib / debug而不是/ usr / lib。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

我认为接受的答案会产生误导,因为/usr/lib/debug中的库不是/lib/usr/lib中的调试编译(-g -O0 ...)版本的库,但是只需调试/lib/usr/lib中相应库中剥离的符号。请参阅How to use debug version of libc的已接受答案以及How to link against debug versions of libc and libstdc++ in GCC?更多详细信息的说明。

行情:

  

/usr/lib/debug中的库不是真正的库。相反,仅包含调试信息,但不包含真实libc.so.6的.text.data部分

  

在许多Linux安装中,调试库不包含实际代码;它们只包含调试信息。这两个是分开的,如果你不需要它们就可以选择不安装它们而且你的磁盘空间不足,但调试库本身并不好。

检查自己:

objdump -h /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.19.so | grep -C1 text
 11 .text         001488a3  000000000001f520  000000000001f520  000002b4  2**4
                  ALLOC, READONLY, CODE

.textALLOC但没有CONTENTS。与/lib/x86_64-linux-gnu/libc-2.19.so中的相应库进行比较:

$ objdump -h /lib/x86_64-linux-gnu/libc-2.19.so | grep -C1 text
 11 .text         001488a3  000000000001f520  000000000001f520  0001f520  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE

答案 1 :(得分:3)

假设Linux,

  1. 静态库:向链接器命令行添加-L/usr/lib/debuggcc / ld将在默认系统目录之前查看。使用ldd命令验证是否链接了正确的库版本(仅限共享库)。
  2. 共享库:设置LD_LIBRARY_PATH=usr/lib/debug,即使没有第1步,您的应用程序也会从那里获取库,只要有一个库的版本,如果您使用发行版的软件包管理器安装它很可能
  3. 但是,这两者都是一个好主意,因为有些库可能只是静态形式。

答案 2 :(得分:-1)

使用链接器标志。 ld / gcc -L<LIBRARY_PATH>对于链接时间非常重要,无论是共享还是静态,如果链接器无法找到它,则无法链接到库。

对于共享库,环境变量LD_LIBRARY_PATH对于启动时间非常重要。当您启动应用程序时,动态库加载程序 ld.so ld-linux.so 将在那里查找。