如何在GCC中链接libc和libstdc ++的调试版本?

时间:2012-01-09 22:11:49

标签: c++ c debugging gcc

我知道this question,但它似乎对我不起作用。

对于设置,请使用一个简单的C ++程序hw.cpp,由int main() { }

给出

在Linux上使用g++ -o hw hw.cpp -O0 -g进行编译时,运行ldd ./hw会给出:

    linux-gate.so.1 =>  (0x003e5000)
    libstdc++.so.6 => /usr/local/lib/libstdc++.so.6 (0x007c5000)
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x006a4000)
    libgcc_s.so.1 => /usr/local/lib/libgcc_s.so.1 (0x00a40000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00a93000)
    /lib/ld-linux.so.2 (0x00a0f000)

现在我似乎也在/usr/lib/debug/lib/tls/i686/cmov/中有调试库,我想这是系统库的相应调试版本。

问题:如何编译我的程序,使其与标准C和/或C ++库的调试版本链接,libc / libm / { {1}},共享还是静态?对于共享构建,我希望libstdc++的输出指向调试目录。

(背景:我的项目使用的一个共享库被Valgrind报告为泄漏(“仍然可以访问”),但起源不是在共享库本身,而是在dlopen类型的代码中( see here。所以我想如果我可以逐步完成CRT中的ldd ./hw调用,我可以追查罪魁祸首。)

更新/更正:我认为我非常非常愚蠢 - 调试库可能始终按需要链接。我对调试器在步进时没有显示任何内容感到困惑,这是因为我没有库的源代码

更新II:好的,保留以前的更新。我现在有了库源代码,但是虽然标准库带有debug symbols ,但我似乎没有单独的debug build 。这样的构建是否可用,我将如何链接它?

2 个答案:

答案 0 :(得分:9)

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

GDB通常预先配置为在需要时找到调试库。

当然,您的系统可能不同。你不说它是什么。

答案 1 :(得分:0)

您的程序被链接到调试库。

只有'ldd ./hw'在标准位置找到libstdc ++。 为此,您需要更改LD_LIBRARY_PATH以使加载的调试共享库和ldd能够正确找到它们。