【问题标题】:How do I tell gcc (or ld) to link against debug versions of the standard c and c++ libraries如何告诉 gcc(或 ld)链接到标准 c 和 c++ 库的调试版本
【发布时间】:2011-03-10 21:40:24
【问题描述】:

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

【问题讨论】:

    标签: debugging gcc linker compilation


    【解决方案1】:

    我认为接受的答案具有误导性,因为 /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
    

    【讨论】:

      【解决方案2】:

      假设 Linux,

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

      不过,两者都做是个好主意,因为有些库可能只是静态形式。

      【讨论】:

      • 可行,但我想我必须更改 LD_LIBRARY_PATH 才能加载调试共享库,对吧?
      • @Jonathan Fischoff,如果您要链接到共享库,是的。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-09-19
        • 2012-07-20
        • 2011-03-24
        • 1970-01-01
        • 2011-09-28
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        相关资源
        最近更新 更多