建立針對arm-linux的交叉編譯環境

來源:互聯網
上載者:User
 

交叉編譯環境介紹 

交叉編譯是嵌入式開發過程中的一項重要技術,它的主要特徵是某機器中執行的程式碼不是在原生編譯產生,而是由另一台機器編譯產生,一般把前者稱為目標機,後者稱為主機。採用交叉編譯的主要原因在於,多數嵌入式目標系統不能提供足夠的資源供編譯過程使用,因而只好將編譯工程轉移到高效能的主機中進行。 

linux下的交叉編譯環境重要包括以下幾個部分: 

針對目標系統的編譯器gcc 

針對目標系統的二進位工具binutils 

目標系統的標準c庫glibc 

目標系統的linux核心標頭檔 

交叉編譯環境的建立步驟 

下載原始碼 

下載包括binutils、gcc、glibc及linux核心的原始碼(需要注意的是,glibc和核心原始碼的版本必須與目標機上實際使用的版本保持一致),並設定shell變數PREFIX指定可執行程式的安裝路徑。 

編譯binutils 

首先運行configure檔案,並使用--prefix=$PREFIX參數指定安裝路徑,使用--target=arm-linux參數指定目標機類型,然後執行make install。 

配置linux核心標頭檔 

首先執行make mrproper進行清理工作,然後執行make config ARCH=arm(或make menuconfig/xconfig ARCH=arm)進行配置(注意,一定要在命令列中使用ARCH=arm指定cpu架構,因為預設架構為主機的cpu架構),這一步需要根據目標機的實際情況進行詳細的配置,筆者進行的實驗中目標機為HP的ipaq-hp3630 PDA,因而設定system type為SA11X0,SA11X0 Implementations中選擇Compaq iPAQ H3600/H3700。 

配置完成之後,需要將核心標頭檔拷貝到安裝目錄: cp -dR include/asm-arm $PREFIX/arm-linux/include/asm cp -dR include/linux $PREFIX/arm-linux/include/linux 

第一次編譯gcc 

首先運行configure檔案,使用--prefix=$PREFIX參數指定安裝路徑,使用--target=arm-linux參數指定目標機類型,並使用--disable-threads、--disable-shared、--enable-languages=c參數,然後執行make install。這一步將產生一個最簡的gcc。由於編譯整個gcc是需要目標機的glibc庫的,它現在還不存在,因此需要首先產生一個最簡的gcc,它只需要具備編譯目標機glibc庫的能力即可。 

交叉編譯glibc 

這一步驟產生的程式碼是針對目標機cpu的,因此它屬於一個交叉編譯過程。該過程要用到linux核心標頭檔,預設路徑為$PREFIX/arm-linux/sys-linux,因而需要在$PREFIX/arm-linux中建立一個名為sys-linux的軟串連,使其核心標頭檔所在的include目錄;或者,也可以在接下來要執行的configure命令中使用--with-headers參數指定linux核心標頭檔的實際路徑。 

configure的運行參數設定如下(因為是交叉編譯,所以要將編譯器變數CC設為arm-linux-gcc): 

CC=arm-linux-gcc ./configure --prefix=$PREFIX/arm-linux --host=arm-linux --enable-add-ons 

最後,按以上配置執行configure和make install,glibc的交叉編譯過程就算完成了,這裡需要指出的是,glibc的安裝路徑設定為$PREFIXARCH=arm/arm-linux,如果此處設定不當,第二次編譯gcc時可能找不到glibc的標頭檔和庫。 

第二次編譯gcc 

運行configure,參數設定為--prefix=$PREFIX --target=arm-linux --enable-languages=c,c++。 

運行make install。 

到此為止整個交叉編譯環境就完全產生了。 

幾點注意事項 

第一點、在第一次編譯gcc的時候可能會出現找不到stdio.h的錯誤,解決辦法是修改gcc/config/arm/t-linux檔案,在TARGET_LIBGCC2_CFLAGS變數的設定中增加-Dinhibit_libc和-D__gthr_posix_h。 

第二點、對與2.3.2版本的glibc庫,編譯linuxthread/sysdeps/pthread/sigaction.c時可能出錯,需要通過補丁glibc-2.3.2-arm.patch解決:執行patch -p1 < glibc-2.3.2-arm.patch 

第三點、第二次編譯gcc時可能會出現libc.so的錯誤,這是需要利用文字編輯器手動修改libc.so。 
(e129) 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.