Debugging 如何告诉gcc(或ld)链接到标准c和c+的调试版本+;图书馆

Debugging 如何告诉gcc(或ld)链接到标准c和c+的调试版本+;图书馆,debugging,gcc,linker,compilation,Debugging,Gcc,Linker,Compilation,我有libstdc++和libc的调试版本,以及其他版本,我想链接它们。它们位于/usr/lib/debug中,而不是/usr/lib。有什么想法吗?假设是Linux 静态库:将-L/usr/lib/debug添加到链接器命令行gcc/ld将在默认系统目录之前查看。使用ldd命令验证链接的库版本是否正确(仅限共享库) 共享库:设置LD\u LIBRARY\u PATH=usr/lib/debug,即使没有步骤1,只要有一个库版本,您的应用程序也会从那里获取库,如果您使用发行版的软件包管理器进行安

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

假设是Linux

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

  • 不过,最好同时执行这两种操作,因为有些库可能只是静态形式。

    使用链接器标志ld/gcc
    -L
    仅对链接时间很重要,无论是共享还是静态的,如果链接器找不到库,则无法针对库进行链接


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

    我认为公认的答案是误导的,因为
    /usr/lib/debug
    中的库不是
    /lib
    中库的调试编译(-g-O0…)版本,
    /usr/lib
    ,但只需调试从
    /lib
    /usr/lib
    中相应库中剥离的符号即可。有关更多详细信息,请参阅对和的已接受答案的解释

    引述:

    /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
    ,但没有
    内容
    。与
    /lib/x86_64-linux-gnu/libc-2.19中相应的库进行比较。因此

    $ 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
    

    这是可行的,但我想我必须更改LD_LIBRARY_路径才能加载调试共享库,对吗?@Jonathan Fischoff,如果你是针对共享库进行链接,是的。