Методом "научного тыка" я похоже набрел на последовательность действий, которая позволила мне наконец-то собрать для себя кросскомпилятор.
Для сборки нужны:
- binutils - утилиты типа ar, nm и т.п.
- gcc - он будет нашим кросскомпилятором
- newlib - библиотека языка C, оптимизированная для использования во встраиваемых системах
./configure --prefix=/usr/local/arm-linux/ --target=arm-elf --enable-interwork --enable-multilib --with-float=soft --disable-werrorЗатем, как обычно собираем и устанавливаем binutils. Установка будет произведена в каталог /usr/local/arm-linux. К сожалению, у меня возникли проблемы с правами доступа к подкаталогам каталога arm-linux; но они решаются запуском следующей команды в каталоге arm-linux.
sudo find . -type d -exec chmod go+rx '{}' \;Исполняемые файлы будут расположены в /usr/local/arm-linux/bin. Поместим этот каталог в $PATH, чтобы иметь доступ к утилитам при сборке других программ (желательно поместить нижеследующую строку в ~/.profile и выполнить команду
. ~/.profile):
PATH=$PATH":/usr/local/arm-linux/bin" && export PATHТеперь мы можем обращаться к новым утилитам, используя префикс arm-elf: arm-elf-ar, arm-elf-nm и т.п.
Затем, приступим к сборке кросскомпилятора и библиотеки языка C. Скачаем gcc отсюда и newlib отсюда и распакуем их. Также скачаем обновленный командой GNUARM файл t-arm-elf отсюда и заменим им файл [gcc-source-dir]/gcc/config/arm/t-arm-elf.
Перед сборкой newlib нужно собрать урезанную версию gcc для arm, при помощи которой мы скомпилируем newlib. Затем, уже имея собранную newlib, мы скомпилируем полную версию gcc с newlib.
Сборку gcc следует проводить в отдельном каталоге [gcc-build-dir], который не должен быть расположен внутри каталога [gcc-source-dir], иначе мы получим ошибку:
./gcc/libgcc.mvars: Нет такого файла или каталогаПерейдем в [gcc-build-dir] и выполним команду:
sudo ../[gcc-source-dir]/configure --target=arm-elf --prefix=/usr/local/arm-linux/ --enable-interwork --enable-multilib --with-float=soft --enable-languages="c,c++" --with-newlib --with-headers=../[newlib-source-dir]/newlib/libc/include/ && sudo make && sudo make install
Все, мы получили урезанную версию кросскомпилятора gcc для arm. Нужно перейти в каталог /usr/local/arm-linux/ и вновь (как на стадии с binutils) исправить права доступа на подкаталоги иначе на следующем шаге мы получим ошибку:
arm-elf-gcc: error trying to exec 'cc1': execvp: Нет такого файла или каталогаТеперь приступим к сборке newlib. Перейдем в [newlib-source-dir] и выполним команду:
./configure --target=arm-elf --prefix=/usr/local/arm-linux/ --enable-interwork --enable-multilib --with-float=softДалее, как обычно, make и make install.
Имея собранную newlib приступим к сборке полной версии кросскомпилятора. Перейдем в [gcc-build-dir] и выполним:
sudo make && sudo make installОсталось только вновь исправить права доступа на подкаталоги в каталоге /usr/local/arm-linux.
Теперь все - у нас есть свой кросскомпилятор для архитектуры ARM!
UPD (03.08.2010):
При сборке простого хелловорлда, у меня внезапно выскочила ошибка:
arm-elf-gcc -c -Wall -Wstrict-prototypes -Wno-trigraphs -O0 -pipe -g -mcpu=arm7tdmi main.cОказывается, libmpfr нужно обязательно ставить вместе с gcc. Лично я проделал это так:
/usr/local/arm-linux/libexec/gcc/arm-elf/4.5.0/cc1: error while loading shared libraries: libmpfr.so.1: cannot open shared object file: No such file or directory
make: *** [main.o] Ошибка 1
- Качаем MPFR отсюда. Распаковываем и собираем командой:
./configure --target=arm-elf --prefix=/usr/local/arm-linux/ && make && sudo make install
Теперь libmpfr установлена в /usr/local/arm-linux/lib/ - Переходим в [gcc-build-dir], удаляем оттуда все файлы и каталоги и заново конфигурируем и собираем gcc заново командой:
sudo ../[gcc-source-dir]/configure --target=arm-elf --prefix=/usr/local/arm-linux/ --enable-interwork --enable-multilib --with-float=soft --enable-languages="c,c++" --with-newlib --with-headers=../[newlib-source-dir]/newlib/libc/include/ --with-mpfr=/usr/local/arm-linux/lib/ --without-ppl && sudo make && sudo make install
UPD (16.11.2011):
Все что описано выше является ужаснейшими костылями. Есть способ проще - http://www.gnuarm.com/support.html, готовые бинарники и исходники в секции "Files".
Если не собирается binutis и версия gcc >= 4.3, то добавить опцию --disable-werror для скрипта configure.
Если при сборке ругается на отсутствие makeinfo, а makeinfo в системе есть - подправить переменную MAKEINFO в Makefile на /usr/bin/makeinfo.
Для сборки insight-gdb нужен установленный bison/yacc.