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
Solution 1
As described here: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html __sync_val_compare_and_swap
on some targets will result in a function call (where direct code generation is not available or not yet implemented). That is happening in your case. Assuming that itself is not a problem for you, you then need to link the library which defines __sync_val_compare_and_swap_4
and friends, which I am guessing is libgcc_s (so add -lgcc_s
to your link line).
Solution 2
It looks like there's a related gcc bug:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40134
Maybe try a newer gcc?
Solution 3
I came across a similar problem when compiling NodeJS(which based on V8 engine) on ARMv5 platform.
Basically speaking, your GCC does not have this build-in functions, either because you are using an old version, or these functions are not implemented on your platform yet,so the "-lgcc_s" may even not help.
After Google for hours, I found this blog page( http://vincesoft.blogspot.fr/2012/04/how-to-solve-undefined-reference-to.html ), which explain the cause fairly clear and gave a solution:
Grab the source code of your platform with these functions from GCC code, build the code into a library, install it, and then link your applications against this library.
I did not follow the exact procedures described in this blog, but the idea is the same, and it works.
Hope it helps.
Comments
-
G-71 almost 2 years
Using crosstool scripts i've built under Cygwin the following compilers gcc-4.1.1 and 4.2.0 20061024 (prerelease) for Sparc architecture:
$ ./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
and
$ ./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)
It is necessary for me that i can use in my programs
__sync_val_compare_and_swap
function related to the Atomic-Builtins, which supports whith 4.1.* version of gcc.I try to compile simple C code:
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; }
But i have the following error: (on both compilers):
$ ./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
What's the problem? May be i wrong built compilers? May be Sparc architecture (SPARC v8) doesn't support this feature? I tried to compile my another programs - all good (compiled and executed).