Построение компилятора ARM GNU Cross

Аналогичная (менее описательная) публикация здесь.

Я пытаюсь запустить свою собственную цепочку инструментов, используя недавние выпуски на Ubuntu, и надеялся, что здесь достаточно сообщества Linux, и я могу получить конкретный совет по некоторым проблемам по мере их появления.

С каждой помощью я бы хотел, чтобы этот поворот превратился в полезную ссылку.

Сначала " Crosstool", о котором почти все ссылаются, немного (2006) устарели и "" Crosstool-NG", который, похоже, переносит факел на мою машину. Я бы скорее отлаживал сам процесс, чем script (который, казалось бы, требует от меня понимания процесса).

Ниже приведены основные шаги того, что я до сих пор работаю; в настоящее время я застреваю, пытаясь скомпилировать первый проход 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

Ответ 1

Это была красно-селедка. Очевидно, что кросс-компиляция цепочки инструментов для существующей системы с рабочим GLIBC не требует перекомпиляции GLIBC. Я честно не знаю, как я проигнорировал этот факт.

Итак, хотя я до сих пор не знаю, как скомпилировать GCC и GLIBC, поскольку мне нужен только GCC, я собираюсь отметить это как закрытое.

Если смогу, я вернусь к этому сообщению и отметю, что я в конце концов сделал.

EDIT:

Оформить заказ this.

Ответ 2

Добро пожаловать, вы не одиноки.

История

Я не знаю, почему кросс-компиляция ARM - такой кошмар. Это не мое мнение, посмотрим, что говорят другие...

Построение перекрестной инструментальной пряжки gcc/glibc для использования во встроенных системах разработка была пугающей перспектива, требующая железной воли, дней, если не недели усилий, много Unix и Гну, и иногда готовность возьмите изворотливые ярлыки. (http://www.kegel.com/crosstool/)

Мой компьютер ARM (GuruPlug) работает на Debian, поэтому мне просто нужен стандартный компилятор g++ без каких-либо настроек.

Я использую 32-разрядный Ubuntu на своем ноутбуке. Существуют пакеты deb для кросс-компилятора AVR или даже для Z80, но для ARM нет - почему? Хорошо, мы должны скомпилировать его. Отпустить. Процесс компиляции инструментальной цепочки немного запутан для меня. 14k строк Makefile, спасибо.

Через несколько дней (и ночей) я потерпел неудачу.

Решение

Наконец, я нашел готовое решение. Я только что загрузил облегченное издание этого материала: http://www.codesourcery.com/sgpp/lite_edition.html, и теперь я счастлив. У этого есть уродливый установщик, но он работает. В нем говорится: arm-none-linux-gnueabi-g++ (Sourcery g++ Lite 2010q1-202) 4.4.1, которая является обновленной версией g++.

(У моего друга Mac, и он также не смог скомпилировать инструментальную цепочку после сражения с ним в течение недели. Теперь он использует этот компилятор на виртуальной машине Ubuntu.)

Ответ 3

Вам действительно нужно приложить больше усилий с помощью crosstool-NG, так как список рассылки перекрестных ссылок очень реактивен. Поскольку понимание всего процесса - огромная задача, понимание того, как использовать инструмент, который вы можете повторно использовать, ИМХО более интересен.

Ответ 4

Вот HelenOS установка toolchain arm-32 script, это должно делать то, что вы хотите, с очень маленьким ворчанием. Я использую его сейчас на Ubuntu (я один из разработчиков HelenOS). Это было написано Мартином Деки:

#!/bin/bash

# Cross-Compiler Toolchain for ${PLATFORM}
#  by Martin Decky <[email protected]>
#
#  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-ссылку, просто оставьте комментарий.

Ответ 5

Если вы действительно хотите создать целую цепочку для себя:
http://frank.harvard.edu/~coldwell/toolchain/
http://ftp.snapgear.org/pub/snapgear/tools/arm-linux/build-arm-linux-3.4.4
Имейте в виду, однако, поскольку вы должны искать матрицу совместимости toolchain или вы можете столкнуться с странными ошибками компиляции.

Если у вас все еще есть опция для crosstool-ng, это то, над чем я работал последние несколько дней:
http://blog.stranadurakov.com/2009/08/04/how-to-arm-linux/
Здесь вы найдете мой конфигурационный файл crosstool-ng, который работал у меня.

Ответ 6

Недавно я создал привязку GNU для ARM, используя crosstool-ng. Понадобилось немного проб и ошибок, чтобы выяснить, какие версии компонентов toolchain будут играть хорошо вместе, но я, наконец, получил его работу со следующими версиями:

  • binutils 2.19.1
  • gcc 4.3.2
  • gmp 4.2.2
  • linux kernel 2.6.29.1
  • mpfr 2.3.1
  • uClibc 0.9.30.1

Посмотрите, работают ли они для вас тоже.

Кроме того, OpenWrt в качестве части процесса сборки создает кросс-компиляционную инструментальную цепочку. Вы можете попробовать это, выбрав одну из плат на основе ARM в качестве цели, даже если вы не заинтересованы в создании беспроводного маршрутизатора.

Ответ 7

Мне посчастливилось использовать buildroot для создания наборов инструментов и библиотек для кросс-компиляции Linux. Buildroot использует легкую библиотеку uclibc C, а не glibc, поэтому может не работать в ваших целях. (И получение инструментальной цепочки таким образом может быть не столь захватывающим и компилировать его самостоятельно.)