交叉編譯環境介紹
交叉編譯是嵌入式開發過程中的一項重要技術,它的主要特徵是某機器中執行的程式**不是在本機編譯生成,而是由另一台機器編譯生成,一般把前者稱為目標機,後者稱為主機。採用交叉編譯的主要原因在於,多數嵌入式目標系統不能提供足夠的資源供編譯過程使用,因而只好將編譯工程轉移到高效能的主機中進行。
linux下的交叉編譯環境重要包括以下幾個部分:
針對目標系統的編譯器gcc
針對目標系統的二進位制工具binutils
目標系統的標準c庫glibc
目標系統的linux核心標頭檔案
交叉編譯環境的建立步驟
編譯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)
ARM Linux 交叉編譯
編譯選項 i 指定標頭檔案的目錄 預設的頭檔案目錄是工具鏈裡的include目錄 預設的庫檔案目錄是工具鏈裡的lib 目錄 檔案最多的lib目錄 lib usr lib usr local lib l l 指定使用哪乙個so動態庫 ljpeg 使用libjpeg.so這個動態庫 預設標頭檔案木 us...
ARM Linux平台的Busybox交叉編譯
arm linux平台的busybox 交叉編譯 什麼是busybox呢?從名字上直接理解,busybox是乙個 繁忙的盒子 其實,busybox可以理解為乙個linux的命令集合,我們在進行linux操作時所需要的 常用命令,都可以在busybox裡找到,但busybox又不是簡單的將所有的命令集...
arm linux交叉編譯環境
patch p1 patch 2.4.19 rmk7 6 修改makefile 將 arch arm 7 make menuconfig 配置 核心 8 system type 中選擇 clps711x ep721x based arm system type clps711x ep721x bas...