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

问题描述 投票:0回答:3

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

debugging gcc linker compilation
3个回答
7
投票

我认为接受的答案具有误导性,因为

/usr/lib/debug
中的库不是
/lib
/usr/lib
中库的调试编译(-g -O0 ...)版本,而只是从相应库中剥离的调试符号在
/lib
/usr/lib
。请参阅 How to use debug version of libcHow 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

.text
段是
ALLOC
但没有
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

4
投票

假设Linux,

  1. 静态库:将
    -L/usr/lib/debug
    添加到链接器命令行。
    gcc
    /
    ld
    将在默认系统目录之前查找。使用
    ldd
    命令验证是否链接了正确的库版本(仅限共享库)。
  2. 共享库:设置
    LD_LIBRARY_PATH=/usr/lib/debug
    。即使没有第 1 步,只要有一个库版本,您的应用程序就会从那里获取库,如果您使用发行版的包管理器进行安装,则很可能会发生这种情况。

不过,两者都做是个好主意,因为某些库可能仅采用静态形式。


-1
投票

使用链接器标志。 ld/gcc

-L<LIBRARY_PATH>
仅对链接时间很重要,无论共享还是静态,如果链接器找不到它,则无法链接到库。

对于共享库环境变量

LD_LIBRARY_PATH
对于启动时间很重要。当您启动应用程序时,动态库加载器 ld.sold-linux.so 将在那里查找。

© www.soinside.com 2019 - 2024. All rights reserved.