我有一个测试驱动程序链接到我编写的库。该库使用 autotools,因此它会生成存档(.a 文件)和动态库 (.so)。
当我将我的驱动程序与“g++ -static”链接时,大概是链接到 .a,valgrind 点亮并反复提示“条件跳转或移动取决于未初始化的值”。第一次失败发生在 __pthread_initialize_minimal 中的 main 之前。
当我在没有-static 的情况下进行链接时,大概是在使用.so 进行链接时,我没有收到任何valgrind 投诉。
有人知道为什么吗? valgrind 是否不能与 -static 一起使用?
更新:我什至无法发布我的驱动程序的精简版本,因为它链接到一个我无法精简的非常大的库,但我注意到所有程序中最简单的
int main()
{
return 0;
}
与 -static 链接并从 valgrind 运行时出错:
==15449== Use of uninitialised value of size 8
==15449== at 0x40B0F3: exit (in /home/jdgordo/src/t)
我应该包括我在 64 位 Redhat 5.5 上运行。
最佳答案
Does valgrind just not work with -static?
确实如此。问题不在 Valgrind 中,而是在 glibc 中,它不是 Valgrind 干净的。 glibc 开发人员拒绝修复这些问题(因为这些问题具有“无关紧要”的性质,并且修复它们会花费(几个)周期)。
当您动态链接时,这些错误来自 libc.so.6
,并且可以很容易地被抑制,这是 Valgrind 默认情况下所做的。
但是当您静态链接时,这些错误来自您的可执行文件(现在包括来自 libc.a
的代码),因此默认的 Valgrind 抑制不会抑制它们。
您可以编写新的抑制(参见 Valgrind --gen-suppressions=yes
documentation)。
或者您可以安装并使用 glibc-audit .
关于c++ - 与 -static 链接时出现 Valgrind 错误——为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7506134/