建立GNU交叉編譯環境

創建ARM Linux交叉編譯環境實踐
 
一、準備工作
      
       首先需要一臺運行Linux操作系統的PC以完成我們的編譯工作。
       其次要準備如下一些源文件。
 
       1、源文件準備
         binutils-2.14.tar.gz
         gcc-core-2.95.3.tar.gz
         gcc-g++2.95.3.tar.gz
         glibc-2.2.4.tar.gz
         glibc-linuxthreads-2.2.4.tar.gz
         linux-2.4.21.tar.gz
         patch-2.4.21-rmk1.gz # linux kernel patch for arm
 
    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-linux
export PREFIX=../arm/tool-chain
export TARGET_PREFIX=$PREFIX/$TARGET
export KERNEL_SOURCE_LOCATION=../arm/kernel/linux-2.4.21
export PATH=$PREFIX/bin:$PATH
 
    幾個系統變量經常要用到,TARGET定義了目標機,PREFIX是工具鏈的安裝目錄,KERNEL_SOURCE_LOCATION是內核文件位置。
    TARGET這個變量對於ARM體系的目標機來說取值爲arm-linux,對於其他體系結構的機器如ppc,mips的取值的詳細清單可以參見glibc目錄下的INSTALL文檔.
 
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

       將glibc庫安裝完之後,我們要到$TARGET_PREFIX/lib這個目錄下修改libc.so文件,將其中
             GROUP(/lib/libc.so.6 /lib/libc_noshared.a)
       這個命令腳本中的/lib 的絕對路徑去掉, 也就是改爲如下的形式
            
GROUP(libc.so.6 libc_noshared.a)

       這樣下一步創建完整的編譯器時,才不至於導致錯誤.
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的交叉編譯工具。
 
發佈了90 篇原創文章 · 獲贊 14 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章