h0rr0rr_drag0n 17.06.2010 20:21
Элементарные вещи — Собираем свой кросскомпилятор для ARM.
Недавно, мне потребовалось собрать из gcc кросскомпилятор для ARM-архитектуры. К сожалению, в интернете нет актуальной how-toшки с детальным описание того, как просто собрать только кросскомпилятор под нужную мне архитектуру.
Методом "научного тыка" я похоже набрел на последовательность действий, которая позволила мне наконец-то собрать для себя кросскомпилятор.
Описание под катом.
Для сборки нужны:
binutils - утилиты типа ar, nm и т.п.gcc - он будет нашим кросскомпиляторомnewlib - библиотека языка C, оптимизированная для использования во встраиваемых системах
Для сборки рекомендую выделить отдельный каталог, например ~/toolchain-arm, и проводить все последующие действия внутри него.
Для начала скачиваем последнюю версию binutils отсюда. Распаковываем архив и конфигурируем исходники командой:
./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/config/arm/t-arm-elf.
Перед сборкой newlib нужно собрать урезанную версию gcc для arm, при помощи которой мы скомпилируем newlib. Затем, уже имея собранную newlib, мы скомпилируем полную версию gcc с newlib.
Сборку gcc следует проводить в отдельном каталоге , который не должен быть расположен внутри каталога >, иначе мы получим ошибку:
./gcc/libgcc.mvars: Нет такого файла или каталога
Перейдем в и выполним команду:
sudo ..//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/libc/include/ && sudo make && sudo make install
Все, мы получили урезанную версию кросскомпилятора gcc для arm. Нужно перейти в каталог /usr/local/arm-linux/ и вновь (как на стадии с binutils) исправить права доступа на подкаталоги иначе на следующем шаге мы получим ошибку:
arm-elf-gcc: error trying to exec 'cc1': execvp: Нет такого файла или каталога
Теперь приступим к сборке newlib. Перейдем в и выполним команду:
./configure --target=arm-elf --prefix=/usr/local/arm-linux/ --enable-interwork --enable-multilib --with-float=soft
Далее, как обычно, make и make install.
Имея собранную newlib приступим к сборке полной версии кросскомпилятора. Перейдем в и выполним:
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
/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: *** Ошибка 1
/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: *** Ошибка 1
Оказывается, libmpfr нужно обязательно ставить вместе с gcc. Лично я проделал это так:
1) Качаем MPFR отсюда. Распаковываем и собираем командой:
./configure --target=arm-elf --prefix=/usr/local/arm-linux/ && make && sudo make install
Теперь libmpfr установлена в /usr/local/arm-linux/lib/
2) Переходим в , удаляем оттуда все файлы и каталоги и заново конфигурируем и собираем gcc заново командой:
sudo ..//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/libc/include/ --with-mpfr=/usr/local/arm-linux/lib/ && sudo make && sudo make install
По материалам блога Дракон-линуксоид.
Кажется вы собираете gcc в том же каталоге в котором и расположены его исходные файлы.
Да, с этой ошибкой разобрался. Вчера уже застрял, что не найден arm-elf-cc, кажется.
Запустил сейчас make, чтобы скопировать ошибку, вот что получил:
make<5>: Вход в каталог `/home/volant/ARM/gcc-arm/gcc-build/arm-elf/thumb/libgcc'
/bin/bash ../../../../gcc-4.4.3/libgcc/../mkinstalldirs ../../.././gcc/thumb
/usr/bin/install -c -m 644 libgcc.a ../../.././gcc/thumb/
chmod 644 ../../.././gcc/thumb/libgcc.a
arm-elf-ranlib ../../.././gcc/thumb/libgcc.a
/bin/bash: arm-elf-ranlib: команда не найдена
Хотя здесь она есть:
~/ARM/binutils-arm/arm-elf/bin$ ls -al ranlib
-rwxr-xr-x 2 volant volant 2558552 2010-06-19 00:22 ranlib
configure для gcc:
../gcc-4.4.3/configure --target=arm-elf --prefix=/home/volant/ARM/gcc-build/ --enable-interwork --enable-multilib --with-float=soft --enable-languages="c,c++" --with-newlib --with-headers=/home/volant/ARM/newlib-1.18.0/newlib/libc/include/ --with-gmp=/usr/local/ --with-mpfr=/usr/local/ --with-gmp=/usr/local/ --with-mpfr=/usr/local/ --with-gmp-include=/usr/local/include/ --with-mpfr-include=/usr/local/include/
для newlib:
./configure --target=arm-elf --prefix=/home/volant/ARM/newlib/ --enable-interwork --enable-multilib --with-float=soft
Запустил сейчас make, чтобы скопировать ошибку, вот что получил:
make<5>: Вход в каталог `/home/volant/ARM/gcc-arm/gcc-build/arm-elf/thumb/libgcc'
/bin/bash ../../../../gcc-4.4.3/libgcc/../mkinstalldirs ../../.././gcc/thumb
/usr/bin/install -c -m 644 libgcc.a ../../.././gcc/thumb/
chmod 644 ../../.././gcc/thumb/libgcc.a
arm-elf-ranlib ../../.././gcc/thumb/libgcc.a
/bin/bash: arm-elf-ranlib: команда не найдена
Хотя здесь она есть:
~/ARM/binutils-arm/arm-elf/bin$ ls -al ranlib
-rwxr-xr-x 2 volant volant 2558552 2010-06-19 00:22 ranlib
configure для gcc:
../gcc-4.4.3/configure --target=arm-elf --prefix=/home/volant/ARM/gcc-build/ --enable-interwork --enable-multilib --with-float=soft --enable-languages="c,c++" --with-newlib --with-headers=/home/volant/ARM/newlib-1.18.0/newlib/libc/include/ --with-gmp=/usr/local/ --with-mpfr=/usr/local/ --with-gmp=/usr/local/ --with-mpfr=/usr/local/ --with-gmp-include=/usr/local/include/ --with-mpfr-include=/usr/local/include/
для newlib:
./configure --target=arm-elf --prefix=/home/volant/ARM/newlib/ --enable-interwork --enable-multilib --with-float=soft
Добавлен важный апдейт, про libmpfr!!!11
Привет! Не подскажешь, какие версии binutils и gcc использовались в примере?
Пробовал GCC-4.0.0 и binutils-2.21, GCC-3.4.3 и binutils-2.21 - всё мимо.
Ошибка на pastebin
(для gcc-3.4.3 та же)
Пробовал GCC-4.0.0 и binutils-2.21, GCC-3.4.3 и binutils-2.21 - всё мимо.
Ошибка на pastebin
(для gcc-3.4.3 та же)
Установить это уже невозможно ибо я теперь пользуюсь arm-gcc из убунтовских репов...
Я вроде как закончил писать мега-скрипт для установки тулчейна для АРМ-ов.
У меня Ubuntu 10.10 на ней работает. Но я пока боюсь выкладывать его на общее обозрение. Хочется немного еще потестить -- на разном железе, на разных дистрибутивах.
Кто хочет и может помочь, прошу писать сюда (или сюда http://forum.e-lug.ru/viewtopic.php?id=397&p=3 ).
У меня Ubuntu 10.10 на ней работает. Но я пока боюсь выкладывать его на общее обозрение. Хочется немного еще потестить -- на разном железе, на разных дистрибутивах.
Кто хочет и может помочь, прошу писать сюда (или сюда http://forum.e-lug.ru/viewtopic.php?id=397&p=3 ).
checking whether ln -s works... yes
checking for arm-elf-gcc... /home/volant/ARM/gcc-arm/gcc-4.4.3/host-i686-pc-linux-gnu/gcc/xgcc -B/home/volant/ARM/gcc-arm/gcc-4.4.3/host-i686-pc-linux-gnu/gcc/ -B/home/volant/ARM/gcc-arm//arm-elf/bin/ -B/home/volant/ARM/gcc-arm//arm-elf/lib/ -isystem /home/volant/ARM/gcc-arm//arm-elf/include -isystem /home/volant/ARM/gcc-arm//arm-elf/sys-include
checking for suffix of object files... configure: error: in `/home/volant/ARM/gcc-arm/gcc-4.4.3/arm-elf/libgcc':
configure: error: cannot compute suffix of object files: cannot compile
See `config.log' for more details.
make<1>: *** Ошибка 1
make<1>: Выход из каталога `/home/volant/ARM/gcc-arm/gcc-4.4.3'
make: *** Ошибка 2
volant@volant:~/ARM/gcc-arm/gcc-4.4.3$