====== How to solve __sync_add_and_fetch_4 ======
[[mybuild#linux-atomic|slugOSBE 5.3 binaries]]
I was hit by this problem on september 23rd 2012 :
g++ -DU_CHARSET_IS_UTF8=1 -O3 -W -Wall -ansi -pedantic -Wpointer-arith \
-Wwrite-strings -Wno-long-long -o ../../bin/makeconv makeconv.o \
ucnvstat.o genmbcs.o gencnvex.o -L../../lib -licutu -L../../lib \
-licui18n -L../../lib -licuuc -L../../stubdata -licudata -lpthread \
-ldl -lm
../../lib/libicuuc.so: undefined reference to `__sync_val_compare_and_swap_4'
../../lib/libicuuc.so: undefined reference to `__sync_add_and_fetch_4'
../../lib/libicuuc.so: undefined reference to `__sync_sub_and_fetch_4'
collect2: ld returned 1 exit status
The solution I found was [[http://vincesoft.blogspot.fr/2012/04/how-to-solve-undefined-reference-to.html|here]], dated april 15th 2012. It appears that I try to compile a recent piece of software with a compiler that is too old. modern gcc have the ''%%__sync_val_compare_and_swap_4%%'' functions. Olders don't. The solution, when updating gcc is not an option, is to download a recent compiler, dig the source for the missing functions, just compile the needed files and link your software with this file.
Since this problem happened on my nslu2, an [[wp>ARM]] machine, here is what I did to compile the missing functions.
* from gnu site, download ''gcc-core-4.6.3.tar.gz''
* extract just the needed directory ''gcc-4.6.3/gcc/config/arm/''
* remove the ''HIDDEN'' directives from ''gcc-4.6.3/gcc/config/arm/linux-atomic.c'' file, otherwise, the compiled file is useless.
* build ''linux-atomic.o'' and ''liblinux-atomic.a'' using libtool
* add either the ''.o'' file or the ''.a'' library to any prog that complains about ''%%__sync_add_and_fetch_4%%'' and the like.
I used the ''linux-atomic.o'' file to compile ICU4C 49.1.2 on my nslu2. See [[icu|compilation et installation de ICU4C 49.1.2]] for the details.
Here is exactly what I did to build the ''.o'' and ''.a'' file
schpluntz:linux_atomic (0) $ sudo opkg install libtool
schpluntz:linux_atomic (0) $ tar xf gcc-core-4.6.3.tar.gz gcc-4.6.3/gcc/config/arm/
schpluntz:linux_atomic (0) $ cd gcc-4.6.3/gcc/config/arm/
schpluntz:arm (0) $ sed -i -e 's/define HIDDEN.*/define HIDDEN/' linux-atomic.c
schpluntz:arm (0) $ libtool --tag=CC --mode=compile gcc -g -O2 -MT linux-atomic.lo -MD -MP -MF linux-atomic.Tpo -c -o linux-atomic.lo linux-atomic.c
mkdir .libs
gcc -g -O2 -MT linux-atomic.lo -MD -MP -MF linux-atomic.Tpo -c linux-atomic.c -fPIC -DPIC -o .libs/linux-atomic.o
gcc -g -O2 -MT linux-atomic.lo -MD -MP -MF linux-atomic.Tpo -c linux-atomic.c -o linux-atomic.o >/dev/null 2>&1
schpluntz:arm (0) $ libtool --tag=CC --mode=link gcc -g -O2 -o liblinux-atomic.la linux-atomic.lo
armeb-linux-gnueabi-ar cru .libs/liblinux-atomic.a .libs/linux-atomic.o
armeb-linux-gnueabi-ranlib .libs/liblinux-atomic.a
creating liblinux-atomic.la
(cd .libs && rm -f liblinux-atomic.la && ln -s ../liblinux-atomic.la liblinux-atomic.la)
schpluntz:arm (0) $ sudo cp .libs/linux-atomic.o .libs/liblinux-atomic.a .libs/liblinux-atomic.la /opt/schplurtz/lib/
In the end, here are the symbols in the files :
schpluntz:~ (0) $ nm /opt/schplurtz/lib/liblinux-atomic.a
linux-atomic.o:
00000b84 T __sync_add_and_fetch_1
00000880 T __sync_add_and_fetch_2
000006fc T __sync_add_and_fetch_4
00000cec T __sync_and_and_fetch_1
00000a00 T __sync_and_and_fetch_2
000007bc T __sync_and_and_fetch_4
000010cc T __sync_bool_compare_and_swap_1
00001170 T __sync_bool_compare_and_swap_2
00000e58 T __sync_bool_compare_and_swap_4
00000458 T __sync_fetch_and_add_1
00000184 T __sync_fetch_and_add_2
00000000 T __sync_fetch_and_add_4
000005a8 T __sync_fetch_and_and_1
000002ec T __sync_fetch_and_and_2
000000c0 T __sync_fetch_and_and_4
00000688 T __sync_fetch_and_nand_1
000003dc T __sync_fetch_and_nand_2
00000140 T __sync_fetch_and_nand_4
00000538 T __sync_fetch_and_or_1
00000274 T __sync_fetch_and_or_2
00000080 T __sync_fetch_and_or_4
000004c8 T __sync_fetch_and_sub_1
000001fc T __sync_fetch_and_sub_2
00000040 T __sync_fetch_and_sub_4
00000618 T __sync_fetch_and_xor_1
00000364 T __sync_fetch_and_xor_2
00000100 T __sync_fetch_and_xor_4
00001028 T __sync_lock_release_1
00001000 T __sync_lock_release_2
00000fd8 T __sync_lock_release_4
00000f6c T __sync_lock_test_and_set_1
00000ef8 T __sync_lock_test_and_set_2
00000eb8 T __sync_lock_test_and_set_4
00000ddc T __sync_nand_and_fetch_1
00000b00 T __sync_nand_and_fetch_2
0000083c T __sync_nand_and_fetch_4
00000c74 T __sync_or_and_fetch_1
00000980 T __sync_or_and_fetch_2
0000077c T __sync_or_and_fetch_4
00000bfc T __sync_sub_and_fetch_1
00000900 T __sync_sub_and_fetch_2
0000073c T __sync_sub_and_fetch_4
00000e94 T __sync_synchronize
00001050 T __sync_val_compare_and_swap_1
000010ec T __sync_val_compare_and_swap_2
00001190 T __sync_val_compare_and_swap_4
00000d64 T __sync_xor_and_fetch_1
00000a80 T __sync_xor_and_fetch_2
000007fc T __sync_xor_and_fetch_4
-----
--- //[[schplurtz@free.fr|schplurtz le déboulonné]] 2012/09/23 22:54//