неопределенная ссылка на sync_fetch_and_add_4

Всякий раз, когда я пытаюсь использовать __sync_fetch_and_add с -m32 на 64-битной машине, я получаю следующую ошибку, хотя она нормально компилируется с обычной 64-битной. Я использую компилятор gcc 4.1.2. В чем здесь может быть проблема и какое решение?

replication.cpp:(.text+0xb3b): undefined reference to `__sync_fetch_and_add_4'
replication.cpp:(.text+0xb82): undefined reference to `__sync_fetch_and_add_4'
replication.cpp:(.text+0xcc2): undefined reference to `__sync_fetch_and_add_4'
/tmp/cc7u9FLV.o: In function `potential_barrier_leader(unsigned int, pthread_barrier_t*)':
replication.cpp:(.text+0xd3f): undefined reference to `__sync_fetch_and_add_4'
replication.cpp:(.text+0xd54): undefined reference to `__sync_fetch_and_add_4'
/tmp/cc7u9FLV.o:replication.cpp:(.text+0xdb0): more undefined references to `__sync_fetch_and_add_4' follow
collect2: ld returned 1 exit status
make: *** [all] Error 1

person MetallicPriest    schedule 03.11.2011    source источник


Ответы (3)


Использование флага -march=i486 помогло мне.

person MetallicPriest    schedule 03.11.2011
comment
Не помогло мне при кросс-компиляции в ARM с набором инструментов, который я не могу пересобрать 8( - person Victor Sergienko; 29.04.2016

Попробуйте использовать более новый компилятор GCC (например, GCC 4.6). Я попытался скомпилировать с помощью gcc -S -O3 -m32 -fverbose-asm sync-3.c тестовый файл gcc/testsuite/gcc.c-torture/compile/sync-3.c, и он работает. Мой gcc (в Debian/Sid/AMD64) — это системный компилятор gcc 4.6.2.

person Basile Starynkevitch    schedule 03.11.2011
comment
Использование более новой версии gcc не вариант, потому что у меня нет прав администратора в системе, над которой я работаю. - person MetallicPriest; 03.11.2011
comment
Вам не нужно быть пользователем root, чтобы собрать и установить более новый компилятор. Вы можете ../gcc-4.6.2/configure с --prefix=$HOME/pub --program-suffix=-my4.6.2 и т. д. После установки используйте его через gcc-my4.6.2, предполагая, что $HOME/pub/bin находится в вашем $PATH. - person Basile Starynkevitch; 03.11.2011

хахах! существует более 5 «стандартных атомарных библиотек» (+ поддержка ядра), которые вряд ли можно назвать атомарными, если вы спросите меня. но игнорировать его, это все своевременное отвлечение.

поэтому ваше здание, т.е. glibc, и получите эту ошибку (я сделал)

glibc-2.11.x ожидает, что gcc-4.4.x определит его внутренне, и у вас есть gcc без встроенного атомарного, вероятно, вы не указали арку, которую принимает gcc (из-за отсутствия направлений). glibc любит 786, gcc хочет 386 и, возможно, 786. используйте «родной e» должен сделать это. opt(march) и opt(mtune) НЕ ДОПОЛНИТЕЛЬНЫ, gcc строит неправильно без них (вероятно)

вы не найдете заголовок или libfoo, которые его определяют (скажем так)

для linux-gnu вы можете использовать (простая сборка для moi)

cd gcc-4.4.foo
./configure --with-glibc-version=2.11 --enable-threads=posix \
--disable-cloog --disable-ppl --disable-libssp --enable-__cxa_atexit \
--disable-rpath --disable-nls --disable-bootstrp --disable-multilib \
--with-system-libunwind

ВАЖНО: если вы собираете gcc без mtune March, gcc не будет определять sync_fetch_and_add (ps glibc sync_fetch_and_add_4 — это просто макрос для sync_fetch_and_add, который, опять же, glibc ожидает, определен)

также, если вы замените gcc-3.foo на gcc-4.4.foo и компилируете, вам может понадобиться:

[ -n "$newgnu" ] && CFLAGS="$CFLAGS -march=native -mtune=native "
[ -n "$newgnu" ] && \
CFLAGS="$CFLAGS -std=gnu89 " && CPPFLAGS="$CPPFLAGS -std=gnu89 "

мне недавно нужно это (newgnu) для сборки binutils-ver/: -Wstrict-aliasing=0

cd glibc-2.foo/
./configure  --with-headers=/usr/src/linux/usr/include \
--enable-kernel=2.2.foo \
--disable-profile --disable-sanity-checks --with-tls \
--disable-rpath --disable-nls
  • Спасибо парню из Голландии за публикацию --std, которая может быть проблемой для тех, кто обновляет gcc!

  • нет, спасибо комитетам, которые постоянно меняются, а также создают «стандарты», которые создают проблемы в gcc :( используйте .h или .c соответственно для «встроенного» foo, чтобы добавить функции, которые вы хотите в свой код, как и все остальные !!

повеселись :)

person toey knuwho    schedule 28.12.2014