我在 ARMv8-A 上运行的 Raspberry Pi 4 中使用 g++ 编译并链接了这个简单的程序。
编译器:g++ -Wall -O0 -g3 -std=c++11 -c Main.cpp
链接器:g ++ -static -o“bugTest.elf”./Main.o
编译器版本:
g++(Debian 10.2.1-6)10.2.1 20210110
版权所有 (C) 2020 Free Software Foundation, Inc.
#include <condition_variable>
#include <iostream>
struct TempX
{
std::condition_variable cvx;
};
int main()
{
TempX *x = new TempX;
std::cout << "0 done" << std::endl;
delete x;
std::cout << "1 done test" << std::endl;
return 0;
}
我在使用交叉编译器 aarch64-linux-gnu-g++(或在 Raspberry Pi 4 上使用 g++ 编译器的 SIGABRT)在删除 x 行出现分段错误;
Program received signal SIGABRT, Aborted.
0x00000000004a9810 in raise ()
(gdb) where
#0 0x00000000004a9810 in raise ()
#1 0x0000000000400b78 in abort ()
#2 0x0000000000482178 in __gnu_cxx::__verbose_terminate_handler() ()
#3 0x0000000000480e6c in __cxxabiv1::__terminate(void (*)()) ()
#4 0x0000000000480ed0 in std::terminate() ()
#5 0x000000000040b790 in std::condition_variable::wait(std::unique_lock<std::mutex>&) ()
#6 0x0000000000401454 in TempX::~TempX (this=0x58a040,
__in_chrg=<optimized out>) at Main.cpp:4
#7 0x0000000000401364 in main () at Main.cpp:14
但是如果我在不使用 -static 标志的情况下链接它,我没有收到任何错误。
直接使用 Raspberry Pi 4 上的编译器 g++ 或使用交叉编译器 aarch64-linux-gnu-g++ 时,我遇到了与 -static 标志相同的错误。
谁能解释一下为什么?
回答和更新:感谢多人的及时回答。 glibc 中存在一个错误,即条件变量与“-static”标志不能很好地配合使用。这个错误已经存在了 10 多年了。
请参阅此处的错误报告和讨论:https://bbs.archlinux.org/viewtopic.php?id=274171
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58909
可用的解决方案是不在链接器中使用“-static”标志,或者使用一些未使用的 pthread_cond_xxx() 函数。
对我来说,使用未使用的 pthread_cond_destroy() 解决了问题,只需要一个关于在非空预期参数中使用 nullptr 的警告。
#include <pthread.h>
void pthread_cond_bug() {
pthread_cond_signal((pthread_cond_t *) nullptr);
pthread_cond_init((pthread_cond_t *) nullptr,
(const pthread_condattr_t *) nullptr);
pthread_cond_destroy((pthread_cond_t *) nullptr);
pthread_cond_timedwait((pthread_cond_t *) nullptr, (pthread_mutex_t *)
nullptr, (const struct timespec *) nullptr);
pthread_cond_wait((pthread_cond_t *) nullptr, (pthread_mutex_t *) nullptr);
}