2009-08-07 14 views
10

Bài đăng tương tự (ít mô tả) là here.Xây dựng trình biên dịch ARM GNU Cross

Tôi đang cố gắng cuộn chuỗi công cụ của riêng mình bằng các bản phát hành gần đây trên Ubuntu và hy vọng có đủ cộng đồng Linux ở đây để tôi có thể nhận được lời khuyên cụ thể về một số vấn đề nhất định.

Với sự giúp đỡ của mọi người, tôi muốn thấy điều này biến thành một tham chiếu hữu ích cuối cùng.

Đầu tiên tắt "Crosstool" mà gần như mọi người đề cập đến là một chút (2006) đã lỗi thời và "Crosstool-NG" dường như hiện đang mang đèn pin bị lỗi trên máy của tôi. Tôi muốn gỡ lỗi quá trình chính nó hơn là một kịch bản (mà nó sẽ có vẻ đòi hỏi tôi phải hiểu quá trình).

Dưới đây là các bước cơ bản của những gì tôi đã làm việc cho đến nay; hiện tại tôi đang cố gắng để biên dịch GCC đầu tiên.

đâu nó thất bại ...

Nó không vì cây thập tự biên soạn thư viện chứa "crti.o" là mất tích:

# ./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 

Build bước

On cài đặt Ubuntu 9.04 mới được cấu hình, đây là các bước tôi đã thực hiện cho đến thời điểm này:

#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 
+0

Chim cánh cụt, chim cánh cụt .. ở khắp mọi nơi! :) –

+0

Xin lỗi, tôi đã đọc sai câu hỏi của bạn, tôi cho rằng bạn biết rằng libc chính xác sẽ xuất hiện trên máy chủ đích .. và bạn vừa biên dịch trên kiến ​​trúc nước ngoài. Vâng, ít nhất, bây giờ bạn có một chuỗi công cụ ARM làm việc :) –

Trả lời

-1

Đây là một chút cá trích đỏ. Rõ ràng việc kết hợp chuỗi công cụ cho một hệ thống hiện có với GLIBC đang hoạt động không yêu cầu phải biên dịch lại GLIBC. Tôi thành thật không biết làm thế nào tôi bỏ qua thực tế này.

Vì vậy, mặc dù tôi vẫn không biết làm thế nào để vượt qua biên dịch GCC GLIBC, vì tôi chỉ cần GCC tôi sẽ đánh dấu điều này là đã đóng.

Nếu có thể, tôi sẽ quay lại bài đăng này và đánh dấu những gì tôi đã làm.

EDIT:

Thanh toán this.

1

Nếu bạn đang thực sự muốn xây dựng toàn bộ toolchain cho chính mình:
http://frank.harvard.edu/~coldwell/toolchain/
http://ftp.snapgear.org/pub/snapgear/tools/arm-linux/build-arm-linux-3.4.4
Hãy ghi nhớ, tuy nhiên, như bạn nên tìm kiếm các ma trận khả năng xử lí toolchain hoặc bạn có thể chạy vào lỗi biên dịch lạ.

Nếu bạn vẫn có tùy chọn cho crosstool-ng, đây là những gì tôi đang làm việc trên cho vài ngày qua:
http://blog.stranadurakov.com/2009/08/04/how-to-arm-linux/
Dưới đây bạn sẽ tìm thấy tập tin cấu hình crosstool-ng của tôi, vốn đã làm việc cho tôi .

2

Đây là tập lệnh cài đặt chuỗi công cụ HelenOS arm-32, điều này sẽ làm những gì bạn muốn với rất ít không quan trọng. Tôi đang sử dụng nó trên Ubuntu bây giờ (tôi là một trong những nhà phát triển HelenOS). Nó được viết bởi Martin Decky:

#!/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." 

Xin lỗi vì mọi gói hàng phải dễ sửa. Nếu bạn muốn có một pastebin hoặc http liên kết để có được nó, chỉ cần để lại một bình luận.

+0

Cảm ơn. Tôi đang thử nó ngay bây giờ; trước khi tôi hy vọng tôi có thể chỉ cần qua dòng cấu hình từ kịch bản của bạn vào những gì tôi đã cố gắng ở trên ... không may mắn (chưa). – Jamie

+0

Bạn đã thử nghiệm điều này chưa? Bin utils không biên dịch. Trong quá trình biên dịch BINUTILS, tôi đã thêm một số tập lệnh "sed" để thay đổi một trong các tệp nguồn. xem http://www.mail-archive.com/[email protected]/msg06475.html – Jamie

+1

Ngoài lỗi biên dịch BinUtils, công cụ này hoạt động nếu bạn muốn trình biên dịch cho kim loại trần. Tôi cần một ngăn xếp công cụ Linux/GLIBC. Cảm ơn mặc dù. – Jamie

1

Gần đây tôi đã xây dựng một chuỗi công cụ GNU cho ARM bằng cách sử dụng crosstool-ng. Phải mất một chút thử và sai để tìm ra các phiên bản của các thành phần toolchain sẽ chơi đẹp với nhau, nhưng tôi cuối cùng đã nhận nó làm việc với các phiên bản sau:

  • binutils 2.19.1
  • gcc 4.3.2
  • gmp 4.2.2
  • hạt nhân Linux 2.6.29.1
  • mpfr 2.3.1
  • uClibc 0.9.30.1

Xem nếu các công việc cho bạn quá.

Ngoài ra, OpenWrt là một phần của quá trình xây dựng, tạo chuỗi công cụ biên dịch chéo. Bạn có thể muốn thử điều đó, chọn một trong các bo mạch dựa trên ARM làm mục tiêu, ngay cả khi bạn không quan tâm đến việc tạo bộ định tuyến không dây.

1

Tôi đã may mắn khi sử dụng buildroot để xây dựng các thanh công cụ và thư viện để biên dịch Linux. Buildroot sử dụng thư viện C uclibc nhẹ hơn là glibc, vì vậy nó có thể không hoạt động cho mục đích của bạn. (Và nhận được chuỗi công cụ theo cách này có thể không hoàn toàn thú vị và tự biên soạn nó.)

7

Chào mừng, bạn không đơn độc.

Câu chuyện

Tôi không biết tại sao ARM cross-biên dịch là một cơn ác mộng như vậy. Đó không phải là quan điểm của tôi, chúng ta hãy xem nói, những gì người khác ...

Xây dựng một gcc/glibc chéo toolchain để sử dụng trong các hệ thống nhúng phát triển từng là một triển vọng đáng sợ, đòi hỏi ý chí sắt đá, ngày nếu không phải hàng tuần nỗ lực, rất nhiều Unix và truyền thuyết Gnu, và đôi khi sẵn sàng có các phím tắt tinh vi. (http://www.kegel.com/crosstool/)

máy tính ARM của tôi (GuruPlug) đang chạy trên Debian, vì vậy tôi chỉ cần một G ++ chuẩn, mà không cần bất kỳ chỉnh.

Tôi đang sử dụng Ubuntu 32 bit trên sổ ghi chép của mình. Có các gói deb cho trình biên dịch chéo AVR, hoặc thậm chí cho Z80, nhưng không có gì cho ARM - tại sao? OK, chúng ta phải biên dịch một. Đi nào. Quá trình biên dịch của toolchain là một chút bối rối đối với tôi. Dòng dài 14k Makefile, cảm ơn bạn.

Sau một số ngày (và đêm) tôi đã thất bại.

Giải pháp

Cuối cùng, tôi đã tìm thấy một out-of-the-box soluion. Tôi vừa tải xuống phiên bản lite của công cụ này: http://www.codesourcery.com/sgpp/lite_edition.html và giờ tôi rất vui. Nó có một trình cài đặt xấu xí, nhưng nó hoạt động.Nó nói: arm-none-linux-gnueabi-g ++ (Sourcery G ++ Lite 2010q1-202) 4.4.1, là phiên bản G ++ cập nhật.

(Bạn tôi có một máy Mac, và ông cũng đã thất bại trong việc lập toolchain sau khi chiến đấu với nó trong một tuần. Ông hiện đang sử dụng trình biên dịch này trên một máy ảo chạy Ubuntu.)

+0

Thách thức cụ thể của tôi là tôi phải liên kết một chuỗi công cụ sử dụng các thư viện hiện có trên đích và sẽ biên dịch phiên bản Kernel mới hơn. Cuối cùng tôi đã nhận được nó để làm việc, tuần sau khi từ bỏ một cách tiếp cận tài liệu vì vậy tôi đã biết ý tưởng những gì tôi đã làm. Bây giờ tôi di chuyển những tập tin nhị phân xung quanh như một tarball, đảm bảo rằng miễn là các thư viện 32 bit được cài đặt trên máy chủ của tôi. – Jamie

+0

Nhân tiện, nhân viên bán hàng, hoặc ít nhất là Carlos, tại mã vạch là vô cùng hữu ích trong sự hiểu biết của tôi về nhu cầu của tôi. Vì những nhu cầu đó, họ không thể giúp tôi 'vượt khỏi cái hộp'; tuy nhiên tôi đã rất ấn tượng với dịch vụ của họ cho một khách hàng tiềm năng. – Jamie

3

Bạn nên thực sự đã đặt nhiều nỗ lực với việc sử dụng crosstool-NG, vì danh sách gửi thư crosstool rất khả thi. Kể từ khi hiểu toàn bộ quá trình là một nhiệm vụ rất lớn, sự hiểu biết làm thế nào để sử dụng một công cụ mà bạn có thể tái sử dụng là IMHO thú vị hơn.

+0

Đồng ý và tôi đang di chuyển theo cách đó. Nhưng tôi đã sử dụng COTS arm boards trong ba năm nay, và có một trường hợp kinh doanh hấp dẫn để fab bộ vi xử lý, ram, vv. crosstool-NG là ... tuyệt vời cho những gì nó cung cấp, nhưng, nó đang tạo ra một dấu chân khá lớn trong 'sys-root'. Bài tập này đang trở thành một sở thích, một nơi tôi muốn nói "yeah, tôi có thể làm điều đó, nhưng tại sao lại bận tâm". – Jamie