在编译时未定义引用`__sync_val_compare_and_swap_4'错误,使用gcc 4.1.1和4.2.0对Sparc v8目标

G-7*_*-71 3 c c++ gcc sparc cross-compiling

使用crosstool脚本我在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
Run Code Online (Sandbox Code Playgroud)

$ ./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)
Run Code Online (Sandbox Code Playgroud)

对我来说,我可以在我的程序中使用__sync_val_compare_and_swapAtomic-Builtins相关的函数,它支持whith 4.1.*版本的gcc.

我尝试编译简单的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;
}
Run Code Online (Sandbox Code Playgroud)

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

$ ./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
Run Code Online (Sandbox Code Playgroud)

有什么问题?可能是我错误的编译器?可能是Sparc架构(SPARC v8)不支持这个功能吗?我试图编译我的另一个程序 - 一切都很好(编译和执行).

Joh*_*nck 6

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

  • 这些文件可能是链接器脚本,而不是实际的共享库.libgcc_s.so应该包含在gcc中,并且不太可能在/ lib或/ usr/lib中(而不是在/ usr/lib/gcc/[target]/[version] /,或类似的东西).检查以确保libgcc_s.so存在; 有时发行版错过了创建实际库的符号链接(可能是libgcc_s.so.1).当然除了.so之外还要检查.a; 它可能只作为静态库提供. (2认同)