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

18

我知道这篇文章,但它对我似乎不起作用。

关于设置,取一个简单的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++库的调试构建,包括共享库或静态库?对于共享构建,我希望ldd ./hw的输出指向调试目录。

(背景:我的项目使用的其中一个共享库被Valgrind报告为泄漏(“仍然可访问”),但原因不在共享库本身,而在于dlopen类型的代码中(请参阅此处)。所以我认为,如果我可以步入CRT中的_Start()调用,就可能能够追踪罪犯。)

更新/更正:我想我只是非常、非常愚蠢——调试库可能一直以来都按照预期链接了。我被调试器在跟踪时没有显示任何内容所困惑,这是因为我没有库的源代码。

更新II:好的,请忽略之前的更新。我现在有了库源代码,但虽然标准库附带调试符号,但我似乎没有单独的调试版本。是否有这样的构建可用,如何链接?


1
你可能知道一些标准库实现使用池来快速分配内存吗?http://valgrind.org/docs/manual/faq.html#faq.undeferrors - Benjamin Bannier
@honk:我完全乐意接受这不是真正的担忧。只是让我困扰的是第三方代码可能会导致我的代码出现警告(请注意,只有对一些我实际上没有的虚假“.c”文件的引用,而不是共享库),我似乎无法抑制...至少使用调试CRT,我希望能够更好地查看。 - Kerrek SB
2个回答

8

在许多Linux安装中,调试库并不包含真正的代码;它们只包含调试信息。为了节省磁盘空间,如果您不需要它们,可以选择不安装它们,但是仅有调试库是没有用的。

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

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


你说得对 - 我一直都链接到了调试库。我被最愚蠢的事情所困扰,那就是我没有标准库的源代码 - 所以调试器在步进时无法显示任何内容! - Kerrek SB
事实上,这并没有多大帮助——我不仅需要调试符号,还需要库的实际调试版本。Debian/Ubuntu 上有这个吗? - Kerrek SB
通常不会。如果您想逐步执行库代码,那么通常优化的库确实是一个问题。当然,如果只是需要特定的库,那么您可以自己重新构建它。sudo apt-get build-dep package-name将安装构建所需的所有内容,源包本身可以通过apt-get source package-name下载。 - ams
我可以获取源代码,例如eglibc-source,但是我该如何链接它,以便不会意外使用标准库?使用-nostdlib参数? - Kerrek SB
假设您正在使用动态库,那么您可能根本不需要重新链接。只需执行 export LD_PRELOAD=/path/to/debug/libc.so.6,然后从该 shell 运行的 任何 程序都将使用调试库。 - ams
显示剩余3条评论

0

你的程序链接到了调试库。

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


这对我也不起作用。我尝试了几种设置该变量的变化,但是ldd没有改变。我知道设置LD_LIBRARY_PATH可以这样工作,因为它可以与其他(非系统)库很好地配合使用...或者你是说ldd永远不会报告调试库? - Kerrek SB
@KerrekSB:你试过了吗(假设使用bash):LD_LIBRARY_PATH=/usr/lib/debug/lib/tls/i686/cmov/ ldd ./hw - Martin York

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接