【发布时间】:2012-01-09 22:11:49
【问题描述】:
我知道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/libstdc++,共享还是静态的?对于共享构建,我希望ldd ./hw 的输出指向调试目录。
(背景:我的项目使用的共享库之一被 Valgrind 报告为泄漏(“仍然可以访问”),但起源不在共享库本身,而是在 dlopen 类型代码中( see here)。所以我想如果我可以在 CRT 中逐步执行 _Start() 调用,我可能能够追踪到罪魁祸首。)
更新/更正:我认为我非常非常愚蠢 - 调试库可能一直都是按需要链接的。我对调试器在单步执行时没有显示任何内容感到困惑,这是因为我没有库的源代码。
更新 II: 好的,保护上一次更新。我现在有库源,但标准库确实带有调试 symbols,但我似乎没有单独的调试 build。这样的构建是否可用,我将如何链接它?
【问题讨论】:
-
您可能知道一些标准库实现使用池进行快速分配? valgrind.org/docs/manual/faq.html#faq.undeferrors
-
@honk:我很高兴接受这不是真正的担忧。让我感到困扰的是第三方代码可能会在 my 代码中引起警告(请注意,我实际上没有引用一些虚假的
.c文件,not 到共享库),我似乎无法抑制......至少通过调试 CRT,我希望能够更好地了解。