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

发布于 2024-12-06 00:00:17 字数 641 浏览 1 评论 0原文

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

I have a test driver linked to a library I wrote. The library uses autotools so it produces both an archive (.a file) and a dynamic library (.so).

When I link my driver with 'g++ -static', presumably linking to the .a, valgrind lights up complaining repeatedly 'Conditional jump or move depends on uninitialised value(s)'. The first failure occurs before main in __pthread_initialize_minimal.

When I link without -static, presumably linking with the .so, I don't get any valgrind complaints.

Does anyone know why? Does valgrind just not work with -static?

UPDATE: I can't post even a pared down version of my driver because it links to a very large library that I couldn't possible pare down, but I notice that simplest of all programs

int main()
{
  return 0;
}

gives an error when linked with -static and run from valgrind:

==15449== Use of uninitialised value of size 8
==15449==    at 0x40B0F3: exit (in /home/jdgordo/src/t)

I should have included that I'm running on 64-bit Redhat 5.5.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

乙白 2024-12-13 00:00:17

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

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

当您动态链接时,这些错误来自 libc.so.6,并且可以轻松抑制,这就是 Valgrind 默认情况下所做的。

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

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

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

Does valgrind just not work with -static?

It does. The problem is not in Valgrind, it's in glibc, which is not Valgrind clean. The glibc developers refused to fix these problems (because the problems are of a "don't care" nature, and fixing them costs (a few) cycles).

When you link dynamically, these errors come from libc.so.6, and can be easily suppressed, which is what Valgrind does by default.

But when you link statically, these errors come from your executable (which now includes code from libc.a), and so the default Valgrind suppressions don't suppress them.

You could write new suppressions (see Valgrind --gen-suppressions=yes documentation).

Or you could install and use glibc-audit.

怪我入戏太深 2024-12-13 00:00:17

如果该库导致 valgrind 出现问题,您只能通过编写抑制文件来忽略这些问题。

我遇到的问题之一是在堆上分配一些东西,如下所示:

// library
int * some = new int;

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

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

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

If the library causes problems in valgrind, you can only ignore those problems by writing suppression files.

One of problems I encountered is alocating something on the heap, like this :

// library
int * some = new int;

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

This example would report an error about leak.

EDIT : if you have the library's source, you can fix the error (use of uninitialized variable), and recompile it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文