[英]what can I do about GNU ld 'legacy __sync_synchronize' warning?
我有一些使用本地范围的程序生命周期对象的C ++代码,例如
void testFunction(int arg) {
static Tested tested(0);
tested.use(arg);
}
用旧版本的GCC构建得很好。 使用GCC 8.2.0,我在链接时收到一个令人费解的警告:
警告:使用旧的兼容__sync_synchronize。 不适合多线程应用程序
它指向定义测试的行,实际上是对编译器生成的__sync_synchronize()的调用。 我想这是确保没有两个线程可以同时运行初始化代码并且延迟初始化产生与加载时初始化相同的结果。
使用Tested类的此实现重现问题:
class Tested {
int sum;
public:
Tested(int init) : sum(init) {}
void use(int arg) {
sum += arg;
}
int current() const {
return sum;
}
};
此代码预计将在单线程嵌入式平台上运行。
我是否相信警告与我无关?
我该怎么办(除了停止使用静态对象)去除警告信息?
您将收到由该版本的newlib生成的链接器警告,告诉您应用程序已调用__sync_synchronize
并且没有实际同步的该函数的实现。 在newlib中实现该函数是一个不执行任何操作的存根(它可能只是存在以确保没有对该函数的未定义引用)。
这些调用可能来自libstdc++.so
,因为ARM上的GCC将为__sync_synchronize
发生的某些原子操作发出__sync_synchronize
调用(例如std::string
或shared_ptr
对象中的引用计数更新)。
要获得使原子正确的工作__sync_synchronize
,您可能需要链接到libatomic
(使用-latomic
),它将具有该函数的实现。 因为您没有链接到那个,所以您在newlib中获得了回退存根实现。 如果您不需要synchronized atomics(因为您的应用程序是单线程的,并且从不尝试更新信号处理程序中的原子),那么我认为您可以忽略该警告。
另一个选择是使用libstdc ++的构建。这样就显式地禁用了所有线程,理论上它不会引用__sync_synchronize
。 但是libstdc ++的构建只能用于单线程应用程序。 您现在使用的构建可用于单线程和多线程代码(即使您收到此警告与单线程情况不太相关)。
您最好等待https://devkitpro.org/viewtopic.php?f=13&t=8822#p16213的回复,而不是在大多数人不熟悉devkitARM的网站上询问。
TL;博士; 使用-fno-threadsafe-statics编译代码并且不用担心。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.