문제

유사한 (설명이 적은) 게시물입니다 여기.

나는 우분투에서 최근 릴리스를 사용하여 내 도구 체인을 굴려고 노력하고 있으며 여기에 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 만 필요하기 때문에 이것을 닫은 것으로 표시 할 것입니다.

가능하다면이 게시물로 돌아와서 결국 한 일을 표시 할 것입니다.

편집하다:

점검 이것.

다른 팁

어서 오십시오, 당신은 혼자가 아닙니다.

이야기

팔 크로스 컴파일이 왜 그런 악몽인지 모르겠습니다. 내 의견이 아니에요, 보자, 다른 사람들의 말 ...

임베디드 시스템 개발에 사용하기 위해 GCC / GLIBC 크로스-툴 체인을 구축하는 것은 무서운 전망이었으며, 철 의지가 필요했으며, 몇 주 동안 노력이 아닌 며칠, 많은 유닉스 및 GNU 지식, 때로는 멍청한 지름길을 의지합니다. ( http://www.kegel.com/crosstool/ )

내 팔 컴퓨터 (구루 플러그)가 데비안에서 실행 중이므로 조정없이 표준 G ++ 컴파일러 만 있으면됩니다.

노트북에 32 비트 우분투를 사용하고 있습니다. AVR 크로스 컴파일러 또는 Z80 용 Deb 패키지가 있지만 ARM에는 아무것도 없습니다. 왜? 좋아, 우리는 하나를 컴파일해야합니다. 갑시다. 도구 체인의 컴파일 프로세스는 약간 혼란 스럽습니다. 14K 라인 긴 makefile, 감사합니다.

며칠 (그리고 밤) 후에 나는 실패했다.

해결책

마침내, 나는 상자 밖의 Soluion을 발견했습니다. 방금이 물건의 Lite Edition을 다운로드했습니다. http://www.codesourcery.com/sgpp/lite_edition.html 그리고 지금 나는 행복합니다. 못생긴 설치 프로그램이 있지만 작동합니다. 그것은 말한다 :ARM-NONE-LINUX-GNUEABI-G ++ (Sourcery G ++ Lite 2010Q1-202) 4.4.1, 이는 최신 G ++ 버전입니다.

(내 친구는 Mac을 가지고 있으며, 일주일 동안 전투 후 툴체인을 컴파일하는 데 실패했습니다. 그는 이제 Ubuntu를 실행하는 VM 에서이 컴파일러를 사용하고 있습니다.)

Crosstool 메일 링리스트가 매우 반응하기 때문에 Crosstool-NG를 사용하는 데 더 많은 노력을 기울여야합니다. 전체 프로세스를 이해하는 것은 큰 작업이므로 재사용 할 수있는 도구를 사용하는 방법을 이해하는 것이 더 흥미 롭습니다.

여기에 있습니다 헬레 노스 ARM-32 도구 체인 설치 스크립트, 이것은 거의 피들링으로 원하는 것을 수행해야합니다. 나는 지금 Ubuntu에서 그것을 사용하고 있습니다 (저는 Helenos 개발자 중 하나입니다). Martin Decky가 작성했습니다.

#!/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 링크를 원한다면 댓글을 남겨주세요.

실제로 전체 도구 체인을 직접 구축하고 싶다면 다음과 같습니다.
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 구성 파일을 찾을 수 있습니다.

나는 최근 Crosstool-NG를 사용하여 ARM 용 GNU 툴체인을 만들었습니다. 어떤 버전의 툴체인 구성 요소가 함께 놀 수 있는지 알아내는 데 약간의 시행 착오가 필요했지만 마침내 다음 버전으로 작업했습니다.

  • 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 기반 보드 중 하나를 대상으로 선택하여 시도해 볼 수 있습니다.

나는 행운을 빕니다 BuildRoot 크로스 컴파일 리눅스를위한 툴체인 및 라이브러리를 구축합니다. BuildRoot은 GLIBC 대신 경량 UCLIBC C 라이브러리를 사용하므로 목적에 맞지 않을 수 있습니다. (그리고 이런 식으로 도구 체인을 얻는 것은 그다지 흥미롭지 않고 직접 편집 할 수 없습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top