LINUX.ORG.RU

Ошибка undefined reference to `__sync_val_compare_and_swap_4' при компиляции кросс компилятором gcc 4.1.1 и 4.2.0 под Sparc


0

1

Пользуясь скриптами crosstool я собрал под Cygwin два кросс компилятора gcc-4.1.1 и 4.2.0 20061024 (prerelease) для архитектуры 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, поддержка которых, согласно http://gcc.gnu.org, включена с версии gcc 4.1.*

Я пробую скомпилировать простенький 'Hello World":

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

В чём может быть ошибка/проблема? Может ли быть такое, что компиляторы как-то криво был собран мною (я в этом деле совсем новичок, тонкостей совсем не знаю). Может быть архитектура не поддерживает? Пробовал компилировать другие свои программы на C, нормально всё компилится и работает, т.е. вроде как компилятор нормально собран.



Последнее исправление: g-71 (всего исправлений: 2)
Ответ на: комментарий от anonymous
 $ ./sparc-unknown-linux-gnu-gcc test_cas.c -O0 -o test_cas /tmp/ccRnKjl7.o: In function `cmpxchg': test_cas.c:(.text+0x24): undefined reference to `__sync_val_compare_and_swap_4' collect2: ld returned 1 exit status 

тоже самое я забил в поиск по тексту __sync_val_compare_and_swap_4 у меня нашллась эта функция в sparc-unknown-linux-gnu\bits\stdc++.h.gch\O0g.gch, sparc-unknown-linux-gnu\bits\stdc++.h.gch\O2g.gch, gcc\builtins.def, cc1.exe, cc1plus.exe и т.д.

g-71
() автор топика

Я не пробовал собирать кросс-компилятор сам, но поставил готовый из emdebian (там 4.4.5). И он твой исходник проглотил без вопросов.

00010420 <cmpxchg>:
   10420:	9d e3 bf a0 	save  %sp, -96, %sp
   10424:	f0 27 a0 44 	st  %i0, [ %fp + 0x44 ]
   10428:	f2 27 a0 48 	st  %i1, [ %fp + 0x48 ]
   1042c:	f4 27 a0 4c 	st  %i2, [ %fp + 0x4c ]
   10430:	c2 07 a0 48 	ld  [ %fp + 0x48 ], %g1
   10434:	c6 07 a0 4c 	ld  [ %fp + 0x4c ], %g3
   10438:	c4 07 a0 44 	ld  [ %fp + 0x44 ], %g2
   1043c:	81 43 e0 0f 	membar  #StoreStore|#LoadStore|#StoreLoad|#LoadLoad
   10440:	88 10 00 03 	mov  %g3, %g4
   10444:	c9 e0 90 01 	cas  [ %g2 ], %g1, %g4
   10448:	82 10 00 04 	mov  %g4, %g1
   1044c:	b0 10 00 01 	mov  %g1, %i0
   10450:	81 cf e0 08 	rett  %i7 + 8
   10454:	01 00 00 00 	nop 
Вполне похоже на блокировки, как мне кажется.

i-rinat ★★★★★
()
Ответ на: комментарий от g-71

а там под какую целевую архитектуру? Sparc ?

Да.

$ sparc-linux-gnu-gcc -v
Using built-in specs.
Target: sparc-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.5-8' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/sparc-linux-gnu/include/c++/4.4.5 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --with-long-double-128 --enable-checking=release --program-prefix=sparc-linux-gnu- --includedir=/usr/sparc-linux-gnu/include --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=sparc-linux-gnu --with-headers=/usr/sparc-linux-gnu/include --with-libs=/usr/sparc-linux-gnu/lib
Thread model: posix
gcc version 4.4.5 (Debian 4.4.5-8) 

$ file a.out 
a.out: ELF 32-bit MSB executable, SPARC32PLUS, V8+ Required, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

ооо, это уже интересно. Т.е. как я понимаю: emdebian это набор toolchain'ов под Debian Linux, которые предоставляют кросс-компиляторы, под различные целевые архитектуры, в том числе и под Sparc V8. А есть какое-нить how-to руководство, как мне всё это быстро развернуть. Я наверное это на ubuntu буду делать. Ща буду разбираться. Спасибо Вам!

g-71
() автор топика
Ответ на: комментарий от g-71

emdebian это набор toolchain'ов под Debian Linux

Я без понятия, что такое emdebian в том виде, в котором он задумывался. Но там есть репозитории с готовыми собранными компиляторами для всех платформ, на которых есть debian. Ещё там есть готовые скрипты для сборки того тулчейна, который тебе нужен. buildcross есть в debian experimental.

А есть какое-нить how-to руководство, как мне всё это быстро развернуть.

Выбрось Cygwin, поставь в виртуалку что-нибудь из GNU/Linux, желательно Debian. С ним ты можешь получить готовый тулчейн за 20 минут. Подключаешь репозитории (здесь адреса: http://www.emdebian.org/crosstools.html). В testing они поломаны, не хватает библиотеки http://packages.debian.org/squeeze/libgmp3c2 , так что если выберешь testing, скачать и установить её придётся вручную. Дальше просто apt-get install gcc-4.4-sparc-linux-gnu. Готово.

Второй вариант: ставишь http://packages.debian.org/experimental/buildcross , запускаешь, он ругнётся на тебя по поводу того что ты сам не знаешь, чего хочешь. Объясняешь ему (подсказки есть), он скачивает и собирает всё сам. 30-40 минут от состояния «не знаю, что запускать» до «готовый тулчейн установлен и готов к работе».

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

спасибо еще раз Вам! Если уж будут какие-то адские проблемы, напишу сюды, но думаю разберусь

g-71
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.