Вопрос

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

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

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

Во - первых "Перекрестный Стул" то, на что почти все ссылаются, немного (2006) устарело и "Перекрестный стул-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-нет-linux-gnueabi-g ++ (Исходный код G ++ Lite 2010q1-202) 4.4.1, которая является обновленной версией G ++.

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

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

Вот этот ХеленОС скрипт установки набора инструментов 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."

Извините за перенос строк, это должно быть легко исправить.Если вы хотите получить его по pastebin или http-ссылке, просто оставьте комментарий.

Если вы действительно хотите создать целую цепочку инструментов для себя:
http://frank.harvard.edu /~coldwell/набор инструментов/
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, который сработал у меня.

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

  • двоичные файлы 2.19.1
  • ссагпз 4.3.2
  • gmp 4.2.2
  • ядро Linux 2.6.29.1
  • mpfr 2.3.1
  • uClibc 0.9.30.1

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top