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 都显示相同的错误)。
如果我不静态链接库,则不会出现错误或警告。
main.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 上静态链接 libpthread
或 libc
几乎总是错误的做法。您的可执行文件可能会以许多微妙的方式被破坏,如果不是现在,那么在将来。
也就是说,您得到 Valgrind 错误的原因已解释为 here。
【讨论】:
以上是关于ubuntu上的静态链接pthread导致未初始化的值跳转(valgrind)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
为啥我得到一个未定义的 pthread_create 引用? [复制]
ubuntu 编译c程序报错:对‘pthread_create’未定义的引用
VS远程开发(远程调试)编译报错:对‘xxx’未定义的引用(设置库依赖顺序)(已解决)pthread(项目-->属性-->链接器-->输入-->库依赖项)