Сборка ARM GNU Cross компилятор - PullRequest
       19

Сборка ARM GNU Cross компилятор

10 голосов
/ 07 августа 2009

Похожий (менее описательный) пост - здесь .

Я пытаюсь развернуть свою собственную цепочку инструментов, используя последние выпуски 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 ]

7 голосов
/ 22 июня 2010

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

История

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

Создание кросс-инструментария gcc / glibc для использования во встроенных системах развитие раньше было страшно перспектива, требующая железной воли, дней, если не недели усилий, много Unix и Гну знания, а иногда и готовность принять хитрые ярлыки. (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.)

3 голосов
/ 28 июля 2010

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

2 голосов
/ 07 августа 2009

Вот сценарий установки HelenOS arm-32 toolchain, он должен делать то, что вы хотите, с минимальными затратами. Сейчас я использую его в 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, просто оставьте комментарий.

1 голос
/ 11 августа 2009

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

1 голос
/ 07 августа 2009

Я недавно создал инструментарий 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 в качестве цели, даже если вы не заинтересованы в создании беспроводного маршрутизатора.

1 голос
/ 07 августа 2009

Если вы действительно хотите собрать весь набор инструментов для себя:
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, который работал для меня.

0 голосов
/ 11 августа 2009

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

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

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

EDIT:

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

...