【问题标题】:Valgrind errors when linked with -static -- Why?与 -static 链接时出现 Valgrind 错误——为什么?
【发布时间】:2011-11-22 07:08:11
【问题描述】:

我有一个链接到我编写的库的测试驱动程序。该库使用自动工具,因此它会生成存档(.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 上运行。

【问题讨论】:

  • 尝试将问题缩小到尽可能少的操作系统代码行并在此处发布。
  • 在各种系统库中有很多失误和捷径,因此在 valgrind 中出现这些并不罕见。我想您可以尝试系统地忽略它们,或者只是使用共享版本进行测试。
  • 我的系统上没有看到这个。 @KerrekSB - 虽然是对的,但这并不是真正值得担心的事情,而且 valgrind 附带了一个大文件,可以抑制其中的大部分。它可能与您系统上的 libc/编译器版本略有不匹配。

标签: c++ valgrind


【解决方案1】:

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

我遇到的一个问题是在堆上分配一些东西,像这样:

// library
int * some = new int;

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

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

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

【讨论】:

    【解决方案2】:

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

    确实如此。问题不在 Valgrind 中,而在 glibc 中,这不是 Valgrind 干净的。 glibc 开发人员拒绝修复这些问题(因为这些问题属于“无关紧要”的性质,并且修复它们需要花费(几个)周期)。

    当你动态链接时,这些错误来自libc.so.6,并且很容易被抑制,这是 Valgrind 默认做的。

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

    你可以编写新的抑制(参见 Valgrind --gen-suppressions=yes documentation)。

    或者你可以安装和使用glibc-audit

    【讨论】:

    • libc 静态链接时 Valgrind 会拦截 malloc 和 free 调用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2012-04-04
    • 2013-07-31
    • 1970-01-01
    相关资源
    最近更新 更多