вторник, 1 апреля 2008 г.

arm-iwmmxt-linux-gnueabi toolchain.

Долго ли коротко боролся я с glibc, но вот появилась новая плата Colibri Toradex PXA270, соответственно новая цель arm-iwmmxt-linux-gnueabi, и дело с glibc заладилось...

Кстати я не исключаю возможности работоспособности данного тулчейна, всмысле возможности использования нового тулчейна, и с старой платой LPC2468, теоретически они вполне совместимы.

Не буду сильно усложнять - как распределить каталоги каждый решит для себя.

Использованы следующие компоненты: binutils-2.18, gcc-4.2.2, glibc-2.7, ядро какое есть.
Для систем без MMU можно использовать тот же elf2flt-20060506, но его функционирование я не тестировал (Мы пока забили на LPC2468, она плохо подходит для наших целей - слишком медленная).

binutils configure: --prefix=$(PREFIX) --target=$(TARGET) --disable-nls
ядро: make header_install INSTALL_HDR_PATH=$(PREFIX)$(TARGET)/
gcc stage1 configure: --prefix=$(PREFIX) --target=$(TARGET) --enable-languages=c --with-arch=iwmmxt --with-tune=iwmmxt --disable-shared --disable-nls --without-mudflap
glibc configure: --prefix=$(PREFIX)$(TARGET)/ --host=$(TARGET) --target=$(TARGET) --with-headers=$(PREFIX)$(TARGET)/include --with-tls --with-__thread --enable-kernel=2.6.23 --disable-nls
gcc stage2 configure: --prefix=$(PREFIX) --target=$(TARGET) --enable-languages=c,c++ --with-arch=iwmmxt --with-tune=iwmmxt --disable-nls

elf2flt как и раньше, nls наверное можно наверное и разрешить.

Чтобы glibc нормально собрался - надо наложить на него пару патчей:

glibc-nptl-crosscompile.patch:

--- glibc-2.4/nptl/sysdeps/pthread/configure.in.ark 2006-03-12 00:41:40.000000000 +0100
+++ glibc-2.4/nptl/sysdeps/pthread/configure.in 2006-03-12 00:44:08.000000000 +0100
@@ -45,5 +45,6 @@
AC_MSG_ERROR([the compiler must support C cleanup handling])
fi
else
- AC_MSG_ERROR(forced unwind support is required)
+ AC_MSG_WARN([forced unwind support is required, can't be verified while crosscompiling])
+ AC_DEFINE(HAVE_FORCED_UNWIND)
fi
--- glibc-2.4/nptl/sysdeps/pthread/configure.ark 2006-03-12 00:42:47.000000000 +0100
+++ glibc-2.4/nptl/sysdeps/pthread/configure 2006-03-12 00:44:08.000000000 +0100
@@ -153,7 +153,10 @@
{ (exit 1); exit 1; }; }
fi
else
- { { echo "$as_me:$LINENO: error: forced unwind support is required" >&5
-echo "$as_me: error: forced unwind support is required" >&2;}
- { (exit 1); exit 1; }; }
+ { echo "$as_me:$LINENO: WARNING: forced unwind support is required, can't be verified while crosscompiling" >&5
+echo "$as_me: WARNING: forced unwind support is required, can't be verified while crosscompiling" >&2;}
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_FORCED_UNWIND 1
+_ACEOF
+
fi


glibc-libeh.patch:

Submitted By: Jim Gifford (patches at jg555 dot com)
Date: 2005-07-20
Initial Package Version: 2.3.5
Origin: Rene Rebe
Upstream Status: Unknown
Description: Removes dependency for libgcc_eh

--- glibc-2.3.5/Makeconfig.orig 2005-07-21 04:53:30.000000000 +0000
+++ glibc-2.3.5/Makeconfig 2005-07-21 04:53:49.000000000 +0000
@@ -503,12 +503,12 @@
libunwind = -lunwind
endif
ifneq ($(have-as-needed),yes)
- libgcc_eh := -lgcc_eh $(libunwind)
+ libgcc_eh := $(libunwind)
else
libgcc_eh := -Wl,--as-needed -lgcc_s$(libgcc_s_suffix) $(libunwind) -Wl,--no-as-needed
endif
gnulib := -lgcc $(libgcc_eh)
-static-gnulib := -lgcc -lgcc_eh $(libunwind)
+static-gnulib := -lgcc $(libunwind)
libc.so-gnulib := -lgcc
endif
ifeq ($(elf),yes)


Да, чуть не забыл.. для glibc еще необходим glibc-ports-2.7, который надо распаковать в каталог glibc-2.7.

Если что-то не получается - пишите, подскажу.

5 коммент.:

Alexander Shaykhrazeev комментирует...

Спасибо за отличную инструкцию. Часть ее отлично сработала, но с glibc большие сложности.
Я собираю нить для AT91SAM9260 (ARM926TEJ-S), собираю с целью arm-none-linux-gnueabi
binutils-2.18.50.0.6
gcc-4.2.3 + патч для soft-float
glibc-2.7
glibc-ports-2.7
+патч для исправления DOCARGS_6/UNDOCARGS_6 проблемы.
Проблемы случаются сначала в функции __isoc99_scanf, там вываливается сообщение о том, что нужно включить exceptions. После добавления опции к CFLAGS=-D__EXCEPTIONS компиляция этого файла происходит успешно, а затем компиляция библиотеки все-равно завершается ошибкой.
Вы с подобным сталкивались в ходе сборки? Можете помочь советом? :-)

Андрей Валяев комментирует...

Странно, у меня не возникало никаких проблем и с DOCARGS_6/UNDOCARGS_6... да как и с исключениями...

Может быть это из за отличного от моего таргета.
Можеть быть попробовать вместо arm-none-linux-gnueabi собирать arm-softfloat-linux-gnueabi или arm-unknown-linux-gnueabi, или вообще arm-linux-gnueabi? С этими таргетами сам черт ногу сломит...

Или просто гуглить в поисках разгадки, мне помогало. :)

Alexander Shaykhrazeev комментирует...

Да, Ваш тег имеет одну особенность, он говорит, что у цели есть хардовый fpu. В случае моей цели необходимо добавить к ней --without-fp --with-soft-fp, одна выключает аппаратный fpu, вторая включает пакет эмуляции fpu.

А под каким дистрибутивом вы занимались сборкой. В гугле я нашел патчи, которые выпустили ubuntu для glibc-2.7.
Я еще проведу эксперименты с glibc.
Для с uClib все собралось на мах.

Спасибо за помощь. :-) Я еще погуглю и решу задачку. Не одни же CodeSourcery умеют их собирать, и писать во всех ответах на вопросы по сборке, "берите наши, т.к. самостоятельная сборка неимоверно сложная." ;-)

Андрей Валяев комментирует...

Насколько знаю iwmmxt практически синоним softfloat.

Вообще я не совсем понимаю нафига нужен softfloat, если в таргетном ядре стоит эмуляция fpu?

Я пользуюсь gentoo. Пробовал гентовскую crossdev, но она какая-то абсолютно неконтролируемая и нифига не собирается. :)

Alexander Shaykhrazeev комментирует...

Я использую Sabayon (тот же gentoo), просто другого линукса под рукой не было, когда начал компилятором заниматься.

Планирую заменить на Fedora на машине для кросс-компиляции.

iwmmxt = Intel Wireless MMX Technology. В процессоре PXA250/270 есть арифметический сопроцессор, насколько я помню (года 1,5 назад занимался подборкой процессора, но от ARM мы тогда отказались, остановившись на PowerPC).
Свой вариант этого блока есть в ARM процах от CirrusLogic.

Когда я задал цель arm-none-linux-gnueabi, компилятор ругался на то что нехорошо так смешивать iwmmxt и другие варианты.

Как разберусь с цепью, добавлю свой вариант. :-) Облегчим другим работу. :-)
1,5 года назад я работал с платкой Toradex Collibri на PXA270. :-)