неопределенная ссылка на ошибку `__sync_val_compare_and_swap_4 'при компиляции с использованием gcc 4.1.1 и 4.2.0 для цели Sparc v8 - PullRequest
3 голосов
/ 17 февраля 2012

Использование crosstool скриптов, которые я построил под Cygwin следующих компиляторов gcc-4.1.1 и 4.2.0 20061024 (предварительная версия) для архитектуры Sparc:

$ ./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)

Мне необходимо, чтобы я мог использовать в своих программах функцию __sync_val_compare_and_swap, связанную с Atomic-Builtins , которая поддерживает версию 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) не поддерживает эту функцию? Я пытался скомпилировать мои другие программы - все хорошо (скомпилировано и выполнено).

Ответы [ 5 ]

6 голосов
/ 17 февраля 2012

Как описано здесь: 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 к вашей строке ссылок). 1008 *

2 голосов
/ 06 октября 2013

Я столкнулся с подобной проблемой при компиляции NodeJS (которая основана на движке V8) на платформе ARMv5.

По сути, ваш GCC не имеет этих встроенных функций, либо потому, что вы используете старую версию, либо эти функции еще не реализованы на вашей платформе, поэтому «-lgcc_s» может даже не помочь.

После Google в течение нескольких часов я нашел эту страницу блога (http://vincesoft.blogspot.fr/2012/04/how-to-solve-undefined-reference-to.html), которая достаточно ясно объясняет причину и дает решение:

Получите исходный код вашей платформы с этими функциями из кода GCC, соберите код в библиотеку, установите его, а затем свяжите ваши приложения с этой библиотекой.

Я не следовал точным процедурам, описанным в этом блоге, но идея та же самая, и она работает.

Надеюсь, это поможет.

2 голосов
/ 27 февраля 2012

Похоже, есть связанная ошибка gcc:

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

Может быть, попробовать более новый gcc?

0 голосов
/ 28 июня 2016

Для меня вышеуказанный сбой означал «вы используете кросс-компилятор gcc / mingw, поэтому -march = native не работает» (я думаю).См. https://stackoverflow.com/a/24213278/32453 (в основном вы можете обойти это, вручную указав параметр -march).

0 голосов
/ 07 апреля 2015

на Android мне удалось решить проблему с помощью следующих флагов LOCAL_CFLAGS + = -O3 -fopenmp LOCAL_LDFLAGS + = -O3 -fopenmp -lgcc -latomic -lgomp

...