3

使用我在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相关的功能,它支持 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;
}

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

$ ./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 架构 (SPARC v8) 不支持此功能?我试图编译我的另一个程序 - 一切都很好(编译并执行)。

4

5 回答 5

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到你的链接行)。

于 2012-02-17T13:32:07.403 回答
2

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

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

也许尝试更新的 gcc?

于 2012-02-27T10:56:36.210 回答
2

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

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

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

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

我没有遵循此博客中描述的确切程序,但想法是相同的,并且有效。

希望能帮助到你。

于 2013-10-06T14:41:34.177 回答
0

在Android上,我能够使用以下标志解决问题 LOCAL_CFLAGS += -O3 -fopenmp LOCAL_LDFLAGS += -O3 -fopenmp -lgcc -latomic -lgomp

于 2015-04-07T19:06:27.477 回答
0

对我来说,上述失败意味着“你正在使用 gcc/mingw 交叉编译器,所以 -march=native 不起作用”(我猜)。请参阅https://stackoverflow.com/a/24213278/32453(基本上您可以通过手动指定 -march 设置来解决它)。

于 2016-06-28T20:15:30.677 回答