如何在GCC中链接libc和libstdc ++的调试版本?
我知道这个问题 ,但它似乎对我不起作用。
对于设置,请使用一个简单的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
/ libstdc++
,共享或静态? 对于共享构建,我希望ldd ./hw
的输出指向调试目录。
(背景:我的项目使用的其中一个共享库被Valgrind报告为泄漏(“仍然可以访问”),但起源不在共享库本身,而是在dlopen类型代码中( 参见此处 )。所以我我想如果我可以逐步完成CRT中的_Start()
调用,我可以追查罪魁祸首。)
更新/更正:我认为我只是非常非常愚蠢 – 调试库可能始终按需要链接。 我对调试器在步进时没有显示任何内容感到困惑,这是因为我没有库的源代码 。
更新II:好的,保留以前的更新。 我现在有了库源代码,但是虽然标准库带有调试符号 ,但我似乎没有单独的调试版本 。 这样的构建是否可用,我将如何链接它?
在许多Linux安装中,调试库不包含实际代码; 它们只包含调试信息。 两者是分开的,因此如果您不需要它们并且缺少磁盘空间,则可以选择不安装它们,但是调试库本身并不好。
GDB通常预先配置为在需要时查找调试库。
当然,您的系统可能不同。 你不说它是什么。
您的程序链接到调试库。
只有’ldd ./hw’才能在标准位置找到libstdc ++。 为此,您需要更改LD_LIBRARY_PATH以使调试共享库加载并使ldd正确找到它们。