ubuntu上的静态链接pthread导致未初始化的值跳转(valgrind)[重复]

Posted

技术标签:

【中文标题】ubuntu上的静态链接pthread导致未初始化的值跳转(valgrind)[重复]【英文标题】:static link pthread on ubuntu causes uninitialised value jumps (valgrind) [duplicate] 【发布时间】:2021-12-12 03:34:44 【问题描述】:

当我在运行时使用 gcc 11.1 编译器在 ubuntu 20.04 上静态链接 pthread 库时,我的程序完全按预期工作。但是,当我尝试在调试模式下运行它并使用 valgrind 检查是否有任何问题时,我很快发现链接 pthread 库会导致弹出很多警告。为什么会这样,这是我应该担心的事情吗? (std::thread 和 std::jthread 都显示相同的错误)。

如果我不静态链接库,则不会出现错误或警告。

ma​​in.cpp:

#include <iostream>
#include <thread>

void foo() 
    std::cout << "Hello world" << std::endl;


int main() 
    std::jthread t(foo);
    return 0;

编译:

g++ main.cpp -std=c++20 -static -pthread -Wl,--whole-archive -lpthread -Wl,--no-whole-archive

我链接 pthread 库的方式我 took from here。否则我会得到一个段错误。

我遇到的错误示例:

==9674== Syscall param set_robust_list(head) points to uninitialised byte(s)
==9674==    at 0x404E65: __pthread_initialize_minimal (nptl-init.c:272)
==9674==    by 0x4B858E: (below main) (in /home/example)
==9674==  Address 0x4000bf0 is in the brk data segment 0x4000000-0x400123f
==9674== 
==9674== Conditional jump or move depends on uninitialised value(s)
==9674==    at 0x4F5780: __register_atfork (in /home/example)
==9674==    by 0x4F574C: __libc_pthread_init (in /home/example)
==9674==    by 0x405056: __pthread_initialize_minimal (nptl-init.c:368)
==9674==    by 0x4B858E: (below main) (in /home/example)
==9674== 
==9674== Conditional jump or move depends on uninitialised value(s)
==9674==    at 0x4F5804: __register_atfork (in /home/example)
==9674==    by 0x4F574C: __libc_pthread_init (in /home/example)
==9674==    by 0x405056: __pthread_initialize_minimal (nptl-init.c:368)
==9674==    by 0x4B858E: (below main) (in /home/example)
==9674== 
==9674== Conditional jump or move depends on uninitialised value(s)
==9674==    at 0x4FA870: malloc_hook_ini (in /home/example)
==9674==    by 0x5759DA: _dl_get_origin (in /home/example)
==9674==    by 0x5495F4: _dl_non_dynamic_init (in /home/example)
==9674==    by 0x54BF45: __libc_init_first (in /home/example)
==9674==    by 0x4B85C8: (below main) (in /home/example)

关于未初始化的值,它会一直持续下去。

【问题讨论】:

【参考方案1】:

如果我不静态链接库,则不会出现错误或警告。

在 Linux 上静态链接 libpthreadlibc 几乎总是错误的做法。您的可执行文件可能会以许多微妙的方式被破坏,如果不是现在,那么在将来。

也就是说,您得到 Valgrind 错误的原因已解释为 here。

【讨论】:

以上是关于ubuntu上的静态链接pthread导致未初始化的值跳转(valgrind)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得到一个未定义的 pthread_create 引用? [复制]

ubuntu 编译c程序报错:对‘pthread_create’未定义的引用

VS远程开发(远程调试)编译报错:对‘xxx’未定义的引用(设置库依赖顺序)(已解决)pthread(项目-->属性-->链接器-->输入-->库依赖项)

在 AIX 上使用 pthread 进行静态链接

链接错误:Armadillo 库中的“未定义对‘pthread_atfork’的引用”

MFC 静态链接未解析的外部符号