编译时对"__sync_val_compare_and_swap_4"错误的未定义引用,将 gcc 4.1.1 和 4.2.0 用于 Sparc v8 目标

undefined reference to `__sync_val_compare_and_swap_4' error at compilation, using gcc 4.1.1 and 4.2.0 for Sparc v8 target

本文关键字:gcc 用于 目标 v8 Sparc val sync compare and 未定义 编译      更新时间:2023-10-16

使用我在Cygwin下为Sparc架构构建的以下编译器gcc-4.1.1和4.2.0 20061024(预发行版)中的交叉工具脚本:

$ ./sparc-unknown-linux-gnu-gcc -v
Using built-in specs.
Target: sparc-unknown-linux-gnu
Configured with: /crosstool-0.43/build/sparc-unknown-linux-gnu/gcc-4.1.1-glibc-2.3.6/gcc-4.1.1/configure --target=sparc-unknown-linux-gnu --host=i686-host_pc-cygwin --prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu --with-headers=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-gnu/include --with-local-prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-gnu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.1.1

$ ./sparc-unknown-linux-gnu-gcc -v
Using built-in specs.
Target: sparc-unknown-linux-gnu
Configured with: /crosstool-0.43/build/sparc-unknown-linux-gnu/gcc-4.2-20061024-                           glibc-2.3.6/gcc-4.2-20061024/configure --target=sparc-unknown-linux-gnu --host=i                           686-host_pc-cygwin --prefix=/opt/crosstool/gcc-4.2-20061024-glibc-2.3.6/sparc-un                           known-linux-gnu --with-headers=/opt/crosstool/gcc-4.2-20061024-glibc-2.3.6/sparc                           -unknown-linux-gnu/sparc-unknown-linux-gnu/include --with-local-prefix=/opt/cros                           stool/gcc-4.2-20061024-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-g                           nu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atex                           it --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.2.0 20061024 (prerelease)

对我来说,有必要在我的程序中使用与Atomic Builtins相关的__sync_val_compare_and_swap函数,它支持gcc的4.1.*版本。

我尝试编译简单的C代码:

long cmpxchg( long* value, long comp_val, long new_val )
{
    return __sync_val_compare_and_swap( value, comp_val, new_val );
}
int main()
{
    return 0;
}

但我有以下错误:(在两个编译器上):

$ ./sparc-unknown-linux-gnu-gcc test_cas.c -o test_cas
/tmp/ccREXHsP.o: In function `cmpxchg':
test_cas.c:(.text+0x24): undefined reference to `__sync_val_compare_and_swap_4'
collect2: ld returned 1 exit status

怎么了?可能是我构建错了编译器吗?可能是Sparc体系结构(SPARCv8)不支持此功能?我试着编译我的另一个程序——一切都很好(编译并执行)。

如下所述:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html某些目标上的__sync_val_compare_and_swap将导致函数调用(其中直接代码生成不可用或尚未实现)。你的情况就是这样。假设它本身对您来说不是问题,那么您需要链接定义__sync_val_compare_and_swap_4和friends的库,我猜它是libgcc_s(所以将-lgcc_s添加到您的链接行中)。

看起来有一个相关的gcc错误:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40134

也许试试更新的gcc?

我在ARMv5平台上编译NodeJS(基于V8引擎)时遇到了类似的问题。

基本上说,GCC没有这个内置函数,要么是因为您使用的是旧版本,要么是这些函数还没有在您的平台上实现,所以"-lgcc_s"可能甚至没有帮助。

在谷歌搜索了几个小时后,我发现了这个博客页面(http://vincesoft.blogspot.fr/2012/04/how-to-solve-undefined-reference-to.html),相当清楚地解释了原因并给出了解决方案:

从GCC代码中获取具有这些函数的平台的源代码,将代码构建到库中,安装它,然后将应用程序链接到此库。

我没有按照这个博客中描述的确切程序,但想法是一样的,而且很有效。

希望能有所帮助。

在Android上,我用以下标志解决了这个问题LOCAL_FLAGS+=-O3-fopenmpLOCAL_LDFLAGS+=-O3-fopenmp-lgcc-latomic-lgomp

对我来说,上面的失败意味着"你使用的是gcc/mingw交叉编译器,所以-march=native不起作用"(我想)。看见https://stackoverflow.com/a/24213278/32453(基本上,您可以通过手动指定-march设置来解决它)。