c++ - 与 -static 链接时出现 Valgrind 错误——为什么?

标签 c++ valgrind

我有一个测试驱动程序链接到我编写的库。该库使用 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/

相关文章:

c++ - 三元运算符作为命令?

c++ - 如何将列名设置为 csv 文件 - C++

c++ - 抑制 GTK+ 中的 Valgrind 错误

c++ - initializer_list 中的未初始化值(编译器错误?)

c - 所有线程未终止时的 Valgrind 输出

c++ - 浏览器扩展与系统托盘应用

c++ - gcc 4.7.2 虚函数错误

c++ - 使用directshow控制摄像头,使用open cv抓图

c - 初始化 Valgrind 错误

c - 从文本文件中读取单词并存储到动态数组中 C 中的 Valgrind 错误