与-static链接时的Valgrind错误 - 为什么?

时间:2011-09-21 20:22:10

标签: c++ valgrind

我有一个测试驱动程序链接到我写的库。该库使用autotools,因此它生成一个存档(.a文件)和一个动态库(.so)。

当我用“g ++ -static”链接我的驱动程序时,可能会链接到.a,valgrind会反复抱怨“有条件的跳转或移动取决于未初始化的值”。第一次失败发生在__pthread_initialize_minimal中的main之前。

当我没有静态链接时,可能与.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上运行。

2 个答案:

答案 0 :(得分:13)

  

valgrind不能与-static一起使用吗?

确实如此。问题不在于Valgrind,而是在glibc中,这不是Valgrind的清洁。 glibc开发人员拒绝解决这些问题(因为问题属于“不关心”的性质,并且修复了成本(几个)周期)。

当您动态链接时,这些错误来自libc.so.6,并且可以轻松抑制,这是Valgrind默认执行的操作。

但是当您静态链接时,这些错误来自您的可执行文件(现在包含来自libc.a的代码),因此默认的Valgrind抑制不会抑制它们。

您可以编写新的抑制(请参阅Valgrind --gen-suppressions=yes documentation)。

或者您可以安装并使用glibc-audit

答案 1 :(得分:1)

如果库导致valgrind出现问题,则只能通过writing suppression files忽略这些问题。

我遇到的一个问题是在堆上放置一些东西,比如:

// library
int * some = new int;

// main links the library
int main()
{
}

此示例将报告有关泄漏的错误。

编辑:如果您有库的源代码,则可以修复错误(使用未初始化的变量),然后重新编译它。