一、準備工作 首先需要一台運行Linux作業系統的PC以完成我們的編譯工作。 其次要準備如下一些源檔案。 1、源檔案準備 binutils-2.14.tar.gz
ftp://ftp.gnu.org/gnu/binutils/binutils-2.14.tar.gz gcc-core-2.95.3.tar.gz
ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-core-2.95.3.tar.gz gcc-g++2.95.3.tar.gz
ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-g++-2.95.3.tar.gz glibc-2.2.4.tar.gz
ftp://ftp.gnu.org/gnu/glibc/glibc-2.2.4.tar.gz glibc-linuxthreads-2.2.4.tar.gz
ftp://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.2.4.tar.gz linux-2.4.21.tar.gz
ftp://ftp.kernle.org/pub/linux/kernel/v2.4/linux-2.4.21.tar.gz patch-2.4.21-rmk1.gz # linux kernel patch for arm
ftp://ftp.arm.linux.org.uk/pub/linux/arm/kernel/v2.4/patch-2.4.21-rmk1.gz
binutils-2.14.tar.gz這個壓縮包包含有ld,ar,as等一些產生或者處理二進位檔案的工具。 gcc-core-2.95.3.tar.gz這個壓縮包是GCC的主體部分,GCC是GNU Compiler Collection的簡稱,顧名思義,它能夠編譯很多種進階語言,例如C、C++,Java等,而這個壓縮包中含有C編譯器,及公用部分,而對其他語言的支援,採用另外的壓縮包單獨發布。 gcc-g++2.95.3.tar.gz,這個壓縮包就是為使GCC能夠編譯C++程式而單獨發布的。 glibc-2.2.4.tar.gz,libc是很多使用者層應用都要用到的庫,kernel和bootloader不需要這個庫的支援,這個庫主體部分封裝在這個壓縮包內。 glibc-linuxthreads-2.2.4.tar.gz,這是Libc用於支援Posix線程而單獨發布的一個壓縮包。 linux-2.4.21.tar.gz,這個壓縮包就是Linux的核心。 patch-2.4.21-rmk1.gz,這個壓縮包是用來給Linux核心打補丁,以使其可以支援ARM的硬體平台。 2、工作目錄搭建 我們建立如下的分類樹結構 mkdir arm mkdir tool-chain mkdir build-dir mkdir src-dir mkdir setup-dir mkdir kernel arm這個目錄是我們的最頂層工作目錄,我們所有的編譯工作都在這裡完成。 tool-chain這個目錄是我們交叉編譯工具的安裝位置,它下面的bin子目錄存放我們建立好的編譯器,彙編器,連接器,以及編譯好的C庫也會安裝到這個目錄之下。 setup-dir這個目錄用來存放我們下載的壓縮包。 src-dir這個目錄用於存放binutils,gcc,glibc解壓之後的源檔案。 kernel這個目錄用來存放核心檔案,對核心的配置、編譯工作將在這個目錄中完成。 build-dir用來編譯src-dir中的源檔案,具體就是binutils,gcc,glibc的編譯工作將在這個目錄下完成。這種源檔案目錄和編譯目錄分離的編譯方式是GNU所推薦的。 cd ./src-dir tar –xvzf ../setup-dir/ binutils-2.14.tar.gz tar –xvzf ../setup-dir/ gcc-core-2.95.3.tar.gz tar –xvzf ../setup-dir/ glibc-2.2.4.tar.gz tar –xvzf ../setup-dir/ glibc-linuxthreads-2.2.4.tar.gz –directory=./glibc-2.2.4 這樣我們在src-dir目錄下就形成了3個源檔案目錄binutils-2.14,gcc-core-2.95,3,glibc-2.2.4,其中分別存放著binutils tools,gcc,glibc的原始碼。接下來我們到build-dir中建立3個與這三個源檔案目錄對應的編譯目錄。 cd ../build-dir mkdir ../build-dir/build-binutils mkdir ../build-dir/build-gcc mkdir ../build-dir/build-glibc 我們將在這三個目錄中完成對binutils tools, gcc, glibc的配置和編譯工作。下面還要把核心檔案解壓到kernel目錄下,並打補丁。 cd ../kernel tar –xvzf ../setup-dir/ linux-2.4.21.tar.gz cd ./linux-2.4.21 patch –p1 < ../../setup-dir/ patch-2.4.21-rmk1 二、開始建立 1、 確定幾個系統變數cd ../../export TARGET=arm-linuxexport PREFIX=../arm/tool-chainexport TARGET_PREFIX=$PREFIX/$TARGETexport KERNEL_SOURCE_LOCATION=../arm/kernel/linux-2.4.21export PATH=$PREFIX/bin:$PATH 幾個系統變數經常要用到,TARGET定義了目標機,PREFIX是工具鏈的安裝目錄,KERNEL_SOURCE_LOCATION是核心檔案位置。 2、 建立binutils 運行如下命令來建立binutils cd ./build-dir/build-binutils configure ../../src-dir/binutils-2.14/configure –target=$TARGET –prefix=$PREFIX make make install 這時$PREFIX/bin下建立了一些檔案,包括arm-linux-ld,arm-linux-as等。3、 編譯核心 cd ../../kernel/linux-2.4.21 改Makefile檔案使 ARCH = arm CROSS_COMPILE=arm-linux- make menuconfig 在System Types中選擇正確的硬體類型 make dep 之後執行如下操作 mkdir $TARGET_PREFIX/include cp dR $KERNEL_SOURCE_LOCATION/include/arm-asm RGET_PREFIX/include/asm cp dR $KERNEL_SOURCE_LOCATION/include/linux RGET_PREFIX/include/linux 4、 建立boot-trap gcc,這個GCC沒有glibc庫的支援,所以只能用於編譯核心,bootloader等,後面建立C庫也要用到這個編譯器,所以建立它主要是為建立C庫做準備,如果只想編譯核心和bootloader那麼,就可以到此結束。 cd ../../build-dir/build-gcc ../../src-dir/gcc-2.95.3/configure –target=$TARGET –prefix=$PREFIX --with-headers=$ERNEL_SOURCE_LOCATION/include –enable-language=c --disable-threads 然後修改src-dir/gcc-2.95.3/gcc/config/arm/t-linux檔案,在 TARGET_LIBGCC2_CFLAGS中添加如下兩個定義 -Dinhibit-libc –D__gthr_posix_h make make install 這時$PREFIX/bin下建立了一些檔案,主要建立了arm-linux-gcc。5、 建立gblic cd ../build-glibc export CC=arm-linux-gcc ../../src-dir/glibc-2.2.4/configure –host=$TARGET –prefix=$TARGET_PREFIX --enable-add-ons make make install 6、 建立功能健全的GCC,並建立G++ 在成功建立了libc之後,我們就可以建立功能豐富的GCC編譯器了,並且可以建立支援編譯C++程式的G++。 cd ../../src-dir tar –xvzf ../setup-dir/ gcc-g++2.95.3.tar.gz cd ../build-dir/build-gcc export CC=gcc ../../src-dir/gcc-2.95.3/configure –target=$TARGET –prefix=$PREFIX –enable-language=c,c++ 然後修改src-dir/gcc-2.95.3/gcc/config/arm/t-linux檔案,在 TARGET_LIBGCC2_CFLAGS中去除如下兩個定義 -Dinhibit-libc –D__gthr_posix_h make make install 7,至此我們成功的建立了ARM Linux的交叉編譯工具
from: http://www.eeblog.org/user1/sohonas/archives/2006/124.asp