Проклятие кросс-компилятора
Apr. 12th, 2006 10:08 pmдаже по инструкции с IBM developerWorks не получается собрать!
вернее, собирается-то он собирается, но вот новособранный компил glibc уже не хочет компилить. Вывод - что-то где-то опять криво собралось. Чудеса в решете, блин... это было бы смешно.
Вот что я делаю, по шагам:
Кто знает, как это побороть? Или кто знает кого-то, кто знает, как это побороть?
вернее, собирается-то он собирается, но вот новособранный компил glibc уже не хочет компилить. Вывод - что-то где-то опять криво собралось. Чудеса в решете, блин... это было бы смешно.
Вот что я делаю, по шагам:
# config.guess
x86_64-redhat-linux-gnu
# export TARGET=i386-pc-linux-gnu
# export PREFIX=/usr/local/crossgcc
# export TARGET_PREFIX=$PREFIX/$TARGET
# export PATH=$PATH:$PREFIX/bin
# mkdir $TARGET_PREFIX/include
# cd /opt/i386-linux-toolchain/linux-2.4.18
# make ARCH=i386 CROSS_COMPILE=$TARGET menuconfig
...куча бла-бла-бла
# cp -rv include/linux $TARGET_PREFIX/include
...куча бла-бла-бла
# cp -rv include/asm-i386 $TARGET_PREFIX/include/asm
...куча бла-бла-бла
# cp -rv include/asm-generic $TARGET_PREFIX/include/
...куча бла-бла-бла
# cd ../binutils-build
# ../binutils-2.16/configure --target=$TARGET --prefix=$PREFIX -disable-nls -v; make; make install
...куча бла-бла-бла
# cd ../gcc-build
# ../gcc-4.1.0/configure --target=$TARGET --prefix=$PREFIX --without-headers --with-newlib -v
...куча бла-бла-бла
# make all-gcc; make install-gcc
...куча бла-бла-бла. Вроде всё ок. Решаю проверить...
# i386-pc-linux-gnu-gcc /opt/test/test.c -o /opt/test/t
/usr/local/crossgcc/lib/gcc/i386-pc-linux-gnu/4.1.0/../../../../i386-pc-linux-gnu/bin/ld: warning: ld-linux.so.2, needed by /lib/libc.so.6, not found (try using -rpath or -rpath-link)
Сие говорит нам, что линковщик не может загрузить правильные библиотеки (или что там грузит это самое ld-linux.so), но тем не менее...
# objdump -G /opt/test/t
/opt/test/t: file format elf32-i386
...сгенерился правильный код для i386. Успокоения ради и для проверки наших чувств:
# gcc /opt/test/test.c -o /opt/test/t2
# objdump -G /opt/test/t2
/opt/test/t2: file format elf64-x86-64
# /opt/test/t
Hi!
# /opt/test/t2
Hi!
то бишь оба бинарника работают и второй, как того и следовало ожидать, собрался под x86_64 штатным компилером. Теперь пришло время собрать glibc
# cd ../glibc-build
# CC=${TARGET}-gcc ../glibc-2.4/configure --target=$TARGET --prefix=$PREFIX --with-headers=${TARGET_PREFIX}/include
...куча бла-бла-бла, среди которого попадается вот это:
running configure fragment for sysdeps/x86_64/elf
checking for x86-64 TLS support... no
смотрю в config.log:
configure:6: checking for x86-64 TLS support
configure:25: i386-pc-linux-gnu-gcc -c -g -O2 conftest.s 1>&5
conftest.s: Assembler messages:
conftest.s:8: Error: @TLSLD reloc is not supported in 32 bit mode
conftest.s:8: Error: junk `@TLSLD' after expression
conftest.s:8: Error: `bar@TLSLD(%rip)' is not a valid base/index expression
conftest.s:9: Error: bad register name `%rax)'
conftest.s:10: Error: `foo@GOTTPOFF(%rip)' is not a valid base/index expression
conftest.s:11: Error: bad register name `%rdx'
configure:28: $? = 1
configure:36: result: no
То бишь получившийся кросс-ассемблер (из бинутилсов) не поддерживает это самое TLS. И не понятно, как это лечить, в опциях конфигуратора бинутилсов TLS вроде не упоминается. В общем, запускаем...
# make all
И видим кучу строк с сообщениями типа
In file included from include/tls.h:6,
from sysdeps/unix/sysv/linux/x86_64/sysdep.h:26,
from :1:
nptl/sysdeps/x86_64/tls.h:62:3: error: #error "TLS support is required."
И всё, на этом всё прекращается (ясен перец)Кто знает, как это побороть? Или кто знает кого-то, кто знает, как это побороть?
Обещанный идиотский вопрос..
Date: 2006-04-12 07:36 pm (UTC)Ммм... прости, а где прописан путь к нужным библиотекам? А он правильно прописан?
А в этом пути библиотеки в нужном порядке стоят, или как попало?
(сорри, первое, что пришло в голову при беглом взгляде, даже не знаю, насколько это чепуха или нет)
Re: Обещанный идиотский вопрос..
Date: 2006-04-12 07:41 pm (UTC)Re: Обещанный идиотский вопрос..
Date: 2006-04-12 07:56 pm (UTC)Re: Обещанный идиотский вопрос..
Date: 2006-04-12 07:52 pm (UTC)а вообще вот он, этот путь:
/lib
а ld-linux.so.2 находится вот тут:
/lib/ld-linux.so.2
(совсем сходя с ума)
Date: 2006-04-12 07:56 pm (UTC)(если я вообще хоть как-то понимаю, что там происходит..)
Re: (совсем сходя с ума)
Date: 2006-04-12 08:27 pm (UTC)сначала препроцессор разворачивает все директивы, макросы и т.п.
затем парсер пробегает по всему получившемуся С-коду и делает из него ассемблерный код
потом вызывает ассемблер, который делает байт-код
потом вызывает линкер, который берёт этот код и библиотеки, и делает из них исполняемый бинарник
Вот. Чтобы что-то заработало, нужны бинутилсы.
Еще один идиотский вопрос
Date: 2006-04-12 07:47 pm (UTC)Re: Еще один идиотский вопрос
Date: 2006-04-12 07:54 pm (UTC)и совсем дебильное, напоследок
Date: 2006-04-12 07:49 pm (UTC)Я понимаю, это паранойя, но тем не менее?
Re: и совсем дебильное, напоследок
Date: 2006-04-12 07:53 pm (UTC)ой.
Date: 2006-04-12 07:58 pm (UTC)Знаю, что дурь, но вот полное впечатление, что он наоборот пытается..
Re: ой.
Date: 2006-04-12 08:30 pm (UTC)еще, чистое от невежества
Date: 2006-04-12 08:07 pm (UTC)что значит тут $ перед наименованиями prefix и target и что значат эти самые названия?
А то у меня закралось совсем дикое предположение, что сначала оно инициализирует префиксы в одном месте, а потом генерит пустую папку и пытается брать значение префиксов из нее... Но, скорее всего, я просто не въезжаю совсем, что там происходит....
Re: ой.
Date: 2006-04-12 08:28 pm (UTC)TARGET_PREFIX=/usr/local/crossgcc/i386-pc-linux-gnu
no subject
Date: 2006-04-13 01:23 am (UTC)Упадочный стиль
Date: 2006-04-13 03:59 pm (UTC)no subject
Date: 2006-04-13 08:43 am (UTC)Можно попробовать сконфигурить glibc с опциями --without-tls или --enable-add-ons=nptl
no subject
Date: 2006-04-13 03:58 pm (UTC)но это не важно - glibc-2.2.5 точно так же не собирается