我正在尝试更新裸金属嵌入式项目的工具链。我们在Windows上构建,到目前为止,我们一直使用版本5.4.1 20160609(发布)[ARM / embedded-5-branch修订版237715]。
现在我正在尝试版本9.3.1 20200408(发布)(9-2020-q2-update),但是在链接时出现了未定义的符号问题:报告缺少__sync_synchronize,并且我不知道应该从哪个源解决此符号。我需要链接一个我缺失的库吗?是否应该给编译器不同的标志,以便为该函数生成代码?
下面是一个示例,在旧工具链中编译和链接都很好,但在新工具链中失败。两种情况下都使用了这个命令行:
``` arm-none-eabi-g++ -mthumb -specs=nosys.specs sample.cpp ```
精确的错误消息如下所示:
``` c:/projects/cpt_tools/gcc-arm-none-eabi/9.3.1/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld.exe: C:\Users\noone\AppData\Local\Temp\ccSZkMXN.o: in function 'use_static_inst(int)': sample.cpp:(.text+0xc): undefined reference to '__sync_synchronize' collect2.exe: error: ld returned 1 exit status ```
顺便说一句:在Linux上运行我的测试时没有任何区别:
``` noone@nowhere:~/gcc-arm-none-eabi-9-2020-q2-update/bin$ ./arm-none-eabi-g++ -mthumb -specs=nosys.specs sample.cpp /media/persistent_storage/home/rmatano/gcc-arm-none-eabi-9-2020-q2-update/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld: /tmp/ccltslyj.o: in function 'use_static_inst(int)': />sample.cpp:(.text+0xc): undefined reference to '__sync_synchronize' collect2: error: ld returned 1 exit status ```
我发现这个问题的解决方法是:GCC Linaro cross compile fails on linker step on a Windows host,但由于我的代码应该在相当陈旧的硬件('-cpu = arm926ej-s')上运行,因此我不能使用指定的解决方法
以下是sample.cpp的内容:
现在我正在尝试版本9.3.1 20200408(发布)(9-2020-q2-update),但是在链接时出现了未定义的符号问题:报告缺少__sync_synchronize,并且我不知道应该从哪个源解决此符号。我需要链接一个我缺失的库吗?是否应该给编译器不同的标志,以便为该函数生成代码?
下面是一个示例,在旧工具链中编译和链接都很好,但在新工具链中失败。两种情况下都使用了这个命令行:
``` arm-none-eabi-g++ -mthumb -specs=nosys.specs sample.cpp ```
精确的错误消息如下所示:
``` c:/projects/cpt_tools/gcc-arm-none-eabi/9.3.1/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld.exe: C:\Users\noone\AppData\Local\Temp\ccSZkMXN.o: in function 'use_static_inst(int)': sample.cpp:(.text+0xc): undefined reference to '__sync_synchronize' collect2.exe: error: ld returned 1 exit status ```
顺便说一句:在Linux上运行我的测试时没有任何区别:
``` noone@nowhere:~/gcc-arm-none-eabi-9-2020-q2-update/bin$ ./arm-none-eabi-g++ -mthumb -specs=nosys.specs sample.cpp /media/persistent_storage/home/rmatano/gcc-arm-none-eabi-9-2020-q2-update/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld: /tmp/ccltslyj.o: in function 'use_static_inst(int)': />sample.cpp:(.text+0xc): undefined reference to '__sync_synchronize' collect2: error: ld returned 1 exit status ```
我发现这个问题的解决方法是:GCC Linaro cross compile fails on linker step on a Windows host,但由于我的代码应该在相当陈旧的硬件('-cpu = arm926ej-s')上运行,因此我不能使用指定的解决方法
-mcpu=cortex-a9
。以下是sample.cpp的内容:
// compile with 'arm-none-eabi-g++.exe -mthumb -specs=nosys.specs sample.cpp'
//
// result: in function `use_static_inst(int)':
// sample.cpp:(.text+0x18): undefined reference to `__sync_synchronize'
class A
{
int m_i;
public:
A(int i) : m_i(i)
{
}
int value(int x)
{
return m_i + x;
}
};
int use_static_inst(int x)
{
// in preparation for calling the ctor of this static instance
// the compiler generates a call to __sync_synchronize
static A a(0);
return a.value(x);
}
int main(int argc, char* argv[])
{
return use_static_inst(argc);
}
__sync_synchronize
的调用。 - Codo-fno-threadsafe-statics
可以解决链接器问题。不幸的是,我必须处理线程,并且该标志不仅抑制对__sync_synchronize
的调用,还抑制了对__cxa_guard_acquire
和__cxa_guard_release
的调用,而我希望保留这些调用。 - RoMa