Сборка ARM GNU Cross компилятор
Похожий (менее описательный) пост здесь.
Я пытаюсь создать свою собственную цепочку инструментов, используя последние выпуски Ubuntu, и надеялся, что здесь достаточно сообщества Linux, чтобы я мог получить конкретные советы по определенным проблемам по мере их появления.
С каждой помощью я бы хотел, чтобы этот поворот стал полезным справочником.
Во-первых, " Crosstool", на который ссылаются почти все, немного устарел (2006), а " Crosstool-NG", который, похоже, теперь несет факел, не работает на моей машине. Я предпочел бы отлаживать сам процесс, чем сценарий (который, как мне кажется, требует от меня понимания процесса).
Ниже приведены основные шаги того, что я получил до сих пор; В настоящее время я застрял, пытаясь скомпилировать первый проход GCC.
Где это терпит неудачу...
Это сбой, потому что отсутствует кросс-скомпилированная библиотека, содержащая "crti.o":
# ./gcc-4.4.1/configure --target=arm-linux --disable-thread --enable-langauges=c
/bin/bash ../../../gcc-4.4.1/libgcc/../mkinstalldirs .
/usr/src/gnu-4.4.1-build/./gcc/xgcc -B ........
/usr/local/arm-linux/bin/ld: crti.o No such file: No such file or directory
collect2: ld returned 1 exit status
make[2]: *** [libgcc_s.so] Error 1
make[2]: Leaving directory `/usr/src/gnu/gcc-4.4.1-build/arm-linux/libgcc'
make[1]: *** [all-target-libgcc] Error 2
make[1]: Leaving directory `/usr/src/gnu/gcc-4.4.1-build'
make: *** [all] Error 2
Построить шаги
На "только что" настроенной установке Ubuntu 9.04, вот шаги, которые я сделал до сих пор:
#New configuration of Ubuntu 9.04
sudo updatedb
sudo apt-get install build-essential subversion
# For kernel configuration
sudo apt-get install libncurses5-dev
# For building GCC
sudo apt-get install libgmp3-dev libmpfr-dev
#Get Linux Headers for GCC/GLIBC compilations
# I use a hacked Linux from Artilla,
pushd ~ && svn co http://.../linux m501-linux && cd !$
make ARCH=arm m501_defconfig
make ARCH=arm menuconfig
sudo mkdir /usr/local/arm-linux/include
sudo cp -dR include/asm-arm /usr/local/arm-linux/include/asm
sudo cp -dR include/linux /usr/local/arm-linux/include/linux
cd /usr/local/arm-linux/
sudo ln -s include sys-include
popd
#Get sources:
cd /usr/src/
sudo su root
mkdir gnu
ftp ftp.gnu.org
# get gnu/binutils/binutils-2.19.1.tar.bz2
# get gnu/gcc/gcc-4.4.1/gcc-4.4.1.tar.bz2
# get gnu/glibc/glibc-2.10.1.tar.bz2
# get gnu/gdb/gdb-6.8.tar.bz2
#Build Binutils
bzcat binutils-2.19.1.tar.bz2 | tar -xv
mkdir binutils-2.19.1-build && cd !$
cp ../binutils-2.19.1/gas/config/tc-arm.c ./tc-arm.c
sed -r 's/(as_bad[ \t]*\()(.+\[.+\]\))/\1\"%s\",\2/' < ./tc-arm.c > ../binutils-2.19.1/gas/config/tc-arm.c
rm ./tc-arm.c
../binutils-2.19.1/configure --target=arm-linux
make && make install && cd ..
#Build GCC
bzcat gcc-4.4.1.tar.bz2 | tar -xv
mkdir gcc-4.4.1-build && cd !$
../gcc-4.4.1/configure --target=arm-linux --disable-thread --enable-langauges=c -with-headers=/usr/local/arm-linux/include
make
7 ответов
Это было немного красной сельди. Очевидно, что для кросс-компиляции цепочки инструментов для существующей системы с работающим GLIBC не требуется перекомпиляция GLIBC. Я, честно говоря, не знаю, как я проигнорировал этот факт.
Поэтому, хотя я до сих пор не знаю, как кросс-компилировать GCC и GLIBC, так как мне нужен только GCC, я собираюсь пометить это как закрытое.
Если я смогу, я вернусь к этому посту и отмечу, что я в итоге сделал.
РЕДАКТИРОВАТЬ:
Оформить заказ
Добро пожаловать, вы не одиноки.
История
Я не знаю, почему ARM кросс-компиляция такой кошмар. Это не мое мнение, посмотрим, что говорят другие...
Создание кросс-инструментария gcc / glibc для использования в разработке встраиваемых систем представляло собой страшную перспективу, требующую железной воли, нескольких дней, если не недель усилий, большого количества знаний Unix и Gnu, а иногда и желания использовать хитрые ярлыки. ( http://www.kegel.com/crosstool/)
Мой компьютер ARM (GuruPlug) работает на Debian, поэтому мне просто нужен стандартный компилятор G++ без каких-либо настроек.
Я использую 32-битную Ubuntu на своем ноутбуке. Есть пакеты deb для кросс-компилятора AVR или даже для Z80, но нет ни одного для ARM - почему? Хорошо, мы должны скомпилировать один. Поехали. Процесс компиляции цепочки инструментов меня немного смущает. Makefile длиной в 14 тысяч строк, спасибо.
Через несколько дней (и ночей) я потерпел неудачу.
Решение
Наконец, я нашел нестандартный раствор. Я только что загрузил облегченную версию этого материала: http://www.codesourcery.com/sgpp/lite_edition.html и теперь я счастлив. У него ужасный установщик, но он работает. Там написано: arm-none-linux-gnueabi-g ++ (Sourcery G++ Lite 2010q1-202) 4.4.1, которая является современной версией G++.
(У моего друга есть Mac, и он также не смог скомпилировать набор инструментов после недолгой борьбы с ним. Сейчас он использует этот компилятор на виртуальной машине, на которой работает Ubuntu.)
Вот сценарий установки набора инструментов HelenOS arm-32, он должен делать то, что вы хотите, с минимальными усилиями. Сейчас я использую его в Ubuntu (я один из разработчиков HelenOS). Это было написано Мартином Декки:
#!/bin/bash
# Cross-Compiler Toolchain for ${PLATFORM}
# by Martin Decky <martin@decky.cz>
#
# GPL'ed, copyleft
#
check_error() {
if [ "$1" -ne "0" ]; then
echo
echo "Script failed: $2"
exit
fi
}
if [ -z "${CROSS_PREFIX}" ] ; then
CROSS_PREFIX="/usr/local"
fi
BINUTILS_VERSION="2.19.1"
GCC_VERSION="4.3.3"
BINUTILS="binutils-${BINUTILS_VERSION}.tar.gz"
GCC_CORE="gcc-core-${GCC_VERSION}.tar.bz2"
GCC_OBJC="gcc-objc-${GCC_VERSION}.tar.bz2"
GCC_CPP="gcc-g++-${GCC_VERSION}.tar.bz2"
BINUTILS_SOURCE="ftp://ftp.gnu.org/gnu/binutils/"
GCC_SOURCE="ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/"
PLATFORM="arm"
WORKDIR=`pwd`
TARGET="${PLATFORM}-linux-gnu"
PREFIX="${CROSS_PREFIX}/${PLATFORM}"
BINUTILSDIR="${WORKDIR}/binutils-${BINUTILS_VERSION}"
GCCDIR="${WORKDIR}/gcc-${GCC_VERSION}"
OBJDIR="${WORKDIR}/gcc-obj"
echo ">>> Downloading tarballs"
if [ ! -f "${BINUTILS}" ]; then
wget -c "${BINUTILS_SOURCE}${BINUTILS}"
check_error $? "Error downloading binutils."
fi
if [ ! -f "${GCC_CORE}" ]; then
wget -c "${GCC_SOURCE}${GCC_CORE}"
check_error $? "Error downloading GCC Core."
fi
if [ ! -f "${GCC_OBJC}" ]; then
wget -c "${GCC_SOURCE}${GCC_OBJC}"
check_error $? "Error downloading GCC Objective C."
fi
if [ ! -f "${GCC_CPP}" ]; then
wget -c "${GCC_SOURCE}${GCC_CPP}"
check_error $? "Error downloading GCC C++."
fi
echo ">>> Creating destionation directory"
if [ ! -d "${PREFIX}" ]; then
mkdir -p "${PREFIX}"
test -d "${PREFIX}"
check_error $? "Unable to create ${PREFIX}."
fi
echo ">>> Creating GCC work directory"
if [ ! -d "${OBJDIR}" ]; then
mkdir -p "${OBJDIR}"
test -d "${OBJDIR}"
check_error $? "Unable to create ${OBJDIR}."
fi
echo ">>> Unpacking tarballs"
tar -xvzf "${BINUTILS}"
check_error $? "Error unpacking binutils."
tar -xvjf "${GCC_CORE}"
check_error $? "Error unpacking GCC Core."
tar -xvjf "${GCC_OBJC}"
check_error $? "Error unpacking GCC Objective C."
tar -xvjf "${GCC_CPP}"
check_error $? "Error unpacking GCC C++."
echo ">>> Compiling and installing binutils"
cd "${BINUTILSDIR}"
check_error $? "Change directory failed."
./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" "--disable-nls"
check_error $? "Error configuring binutils."
make all install
check_error $? "Error compiling/installing binutils."
echo ">>> Compiling and installing GCC"
cd "${OBJDIR}"
check_error $? "Change directory failed."
"${GCCDIR}/configure" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj --without-headers --disable-shared
check_error $? "Error configuring GCC."
PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc
check_error $? "Error compiling/installing GCC."
echo
echo ">>> Cross-compiler for ${TARGET} installed."
Извините за любую перенос строки, должно быть легко исправить. Если вы хотите получить ссылку на ссылку или http, просто оставьте комментарий.
Вы действительно должны были приложить больше усилий с использованием crosstool-NG, так как список рассылки crosstool очень реактивен. Поскольку понимание всего процесса является огромной задачей, понимание того, как использовать инструмент, который вы можете использовать повторно, ИМХО более интересно.
Недавно я построил инструментарий GNU для ARM, используя crosstool-ng. Потребовалось немного проб и ошибок, чтобы выяснить, какие версии компонентов набора инструментов будут хорошо играть вместе, но я наконец-то начал работать со следующими версиями:
- binutils 2.19.1
- gcc 4.3.2
- gmp 4.2.2
- ядро Linux 2.6.29.1
- MPFR 2.3.1
- uClibc 0.9.30.1
Посмотрите, работают ли они для вас тоже.
Кроме того, OpenWrt как часть процесса сборки создает кросс-компиляцию инструментария. Вы можете попробовать это, выбрав одну из плат на базе ARM в качестве цели, даже если вы не заинтересованы в создании беспроводного маршрутизатора.
Мне повезло, используя http://buildroot.net/ для создания наборов инструментов и библиотек для кросс-компиляции Linux. Buildroot использует облегченную библиотеку uclibc C, а не glibc, поэтому она может не работать в ваших целях. (И получить набор инструментов таким способом может быть не так интересно, как собирать его самостоятельно.)
Если вы действительно хотите собрать весь набор инструментов для себя:
http://frank.harvard.edu/~coldwell/toolchain/
http://ftp.snapgear.org/pub/snapgear/tools/arm-linux/build-arm-linux-3.4.4
Однако имейте в виду, что при поиске матрицы совместимости инструментальной цепочки вы можете столкнуться со странными ошибками компиляции.
Если у вас все еще есть опция crosstool-ng, то над чем я работал последние несколько дней:
http://blog.stranadurakov.com/2009/08/04/how-to-arm-linux/
Здесь вы найдете мой конфигурационный файл crosstool-ng, который работал для меня.