導航:首頁 > 源碼編譯 > 製作linux交叉編譯工具鏈

製作linux交叉編譯工具鏈

發布時間:2025-08-28 22:01:38

Ⅰ 如何製作arm-linux-gcc編譯工具

一、下載源文件
源代碼文件及其版本:
binutils-2.19.tar.bz2, gcc-core-4.4.4.tar.bz2 gcc-g++-4.4.4.tar.bz2 Glibc-2.7.tar.bz2 Glibc-ports-2.7.tar.bz2 Gmp-4.2.tar.bz2 mpfr-2.4.0.tar.bz2mpc-1.0.1.tar.gz Linux-2.6.25.tar.bz2 (由於我在編譯出錯的過程中,根據出錯的信息修改了相關的C代碼,故而沒有下載相應的補丁)
一般一個完整的交叉編譯器涉及到多個軟體,主要包括bilinguals、cc、glibc等。其中,binutils主要生成一些輔助工具;gcc是用來生成交叉編譯器,主要生成arm-linux-gcc交叉編譯工具,而glibc主要提供用戶程序所需要的一些基本函數庫。

二、建立工作目錄
編譯所用主機型號 fc14.i686,虛擬機選的是VM7.0,Linux發行版選的是Fedora9,
第一次編譯時用的是root用戶(第二次用一般用戶yyz), 所有的工作目錄都在/home/yyz/cross下面建立完成,首先在/home/yyz目錄下建立cross目錄,然後進入工作目錄,查看當前目錄。命令如下:

創建工具鏈文件夾
[root@localhost cross]# mkdir embedded-toolchains
下面在此文件夾下建立如下幾個目錄:
setup-dir:存放下載的壓縮包;
src-dir:存放binutils、gcc、glibc解壓之後的源文件;
Kernel:存放內核文件,對內核的配置和編譯工作也在此完成;
build-dir :編譯src-dir下面的源文件,這是GNU推薦的源文件目錄與編譯目錄分離的做法;
tool-chain:交叉編譯工具鏈的安裝位;
program:存放編寫程序;
doc:說明文檔和腳本文件;
下面建立目錄,並拷貝源文件。
[root@localhost cross] #cd embedded- toolchains
[root@localhost embedded- toolchains] #mkdir setup-dir src-dir kernel build-dir tool-chain program doc
[root@localhost embedded- toolchains] #ls
build-dir doc kernel program setup-dir src-dir tool-chain
[root@localhost embedded- toolchains] #cd setup-dir
拷貝源文件:
這里我們採用直接拷貝源文件的方法,首先應該修改setup-dir的許可權
[root@localhost embedded- toolchains] #chmod 777 setup-dir
然後直接拷貝/home/yyz目錄下的源文件到setup-dir目錄中,如下圖:

建立編譯目錄:
[root@localhost setup-dir] #cd ../build-dir
[root@localhost build -dir] #mkdir build-binutils build-gcc build-glibc
三、輸出環境變數
輸出如下的環境變數方便我們編譯。
為簡化操作過程。下面就建立shell命令腳本environment-variables:
[root@localhost build -dir] #cd ../doc
[root@localhost doc] #mkdir scripts
[root@localhost doc] #cd scripts
用編輯器vi編輯環境變數腳本envionment-variables:[root@localhost scripts]
#vi envionment-variables
export PRJROOT=/home/yyz/cross/embedded-toolchains
export TARGET=arm-linux
export PREFIX=$PRJROOT/tool-chain
export TARGET_PREFIX=$PREFIX/$TARGET
export PATH=$PREFIX/bin:$PATH
截圖如下:
執行如下語句使環境變數生效:
[root@localhost scripts]# source ./environment-variables
四、建立二進制工具(binutils)
下面將分步介紹安裝binutils-2.19.1的過程。
[root@localhost script] # cd $PRJROOT/src-dir
[root@localhost src-dir] # tar jxvf ../setup-dir/binutils-2.19.1.tar.bz2
[root@localhost src-dir] # cd $PRJROOT/build-dir/build-binutils
創建Makefile:
[root@localhost build-binutils] #../../src-dir/binutils-2.19.1/configure --target=$TARGET --prefix=$PREFIX
在build-binutils目錄下面生成Makefile文件,然後執行make,make install,此過程比較緩慢,大約需要一個15分鍾左右。完成後可以在$PREFIX/bin下面看到我們的新的binutil。
輸入如下命令
[root@localhost build-binutils]#ls $PREFIX/bin

Ⅱ Linux嵌入式交叉編譯工具鏈問題 淺談

簡介

交叉編譯工具鏈是一個由編譯器、連接器和解釋器組成的綜合開發環境,交叉編譯工具鏈主要由binutils、gcc和glibc 3個部分組成。有時出於減小libc庫大小的考慮,也可以用別的c庫來代替glibc,例如uClibc、dietlibc和newlib。交叉編譯工具鏈主要包括針對目標系統的編譯器gcc、目標系統的二進制工具binutils、目標系統的標准c庫glibc和目標系統的Linux內核頭文件。第一個步驟就是確定目標平台。每個目標平台都有一個明確的格式,這些信息用於在構建過程中識別要使用的不同工具的正確版本。因此,當在一個特定目標機下運行GCC時,GCC便在目錄路徑中查找包含該目標規范的應用程序路徑。GNU的目標規范格式為CPU-PLATFORM-OS。例如,建立基於ARM平台的交叉工具鏈,目標平台名為arm-linux-gnu。

交叉編譯工具鏈的製作方法

  1. 分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。

  2. 通過Crosstool腳本工具來實現一次編譯生成交叉編譯工具鏈。

  3. 直接通過網上(ftp.arm.kernel.org.uk)下載已經製作好的交叉編譯工具鏈。

方法1相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用方法2或方法3構建交叉工具鏈。方法3的優點不用多說,當然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的沒有靈活性,所以構建所用的庫以及編譯器的版本也許並不適合你要編譯的程序,同時也許會在使用時出現許多莫名的錯誤,建議你慎用此方法。


方法1:分步構建交叉編譯工具鏈


  1. 下載所需的源代碼包

  2. 建立工作目錄

  3. 建立環境變數

  4. 編譯、安裝Binutils

  5. 獲取內核頭文件

  6. 編譯gcc的輔助編譯器

  7. 編譯生成glibc庫

  8. 編譯生成完整的gcc

由於在問答中的篇幅,我不能細述具體的步驟,興趣的同學請自行閱讀開源共創協議的《Linux from scratch》,網址是:linuxfromscratch dot org


方法2:用Crosstool工具構建交叉工具鏈(推薦)

Crosstool是一組腳本工具集,可構建和測試不同版本的gcc和glibc,用於那些支持glibc的體系結構。它也是一個開源項目,下載地址是kegel dot com/crosstool。用Crosstool構建交叉工具鏈要比上述的分步編譯容易得多,並且也方便許多,對於僅僅為了工作需要構建交叉編譯工具鏈的你,建議使用此方法。

運行which makeinfo,如果不能找見該命令,在解壓texinfo-4.11.tar.bz2,進入texinfo-4.11目錄,執行./configure&&make&&make install完成makeinfo工具的安裝

下載所需資源文件linux-2.4.20.tar.gz、binutils-2.19.tar.bz2、gcc-3.3.6.tar.gz、glibc- 2.3.2.tar.gz、glibc-linuxthreads-2.3.2.tar.gz和gdb-6.5.tar.bz2。然後將這些工具包文件放在新建的$HOME/downloads目錄下,最後在$HOME/目錄下解壓crosstool-0.43.tar.gz,命

令如下:
#cd$HOME/
#tar–xvzfcrosstool-0.43.tar.gz

接著需要建立自己的編譯腳本,起名為arm.sh,為了簡化編寫arm.sh,尋找一個最接近的腳本文件demo-arm.sh作為模板,然後將該腳本的內容復制到arm.sh,修改arm.sh腳本,具體操作如下:

# cd crosstool-0.43

# cp demo-arm.sh arm.sh

# vi arm.sh

修改後的arm.sh腳本內容如下:

#!/bin/sh
set-ex
TARBALLS_DIR=$HOME/downloads#定義工具鏈源碼所存放位置。
RESULT_TOP=$HOME/arm-bin#定義工具鏈的安裝目錄
exportTARBALLS_DIRRESULT_TOP
GCC_LANGUAGES="c,c++"#定義支持C,C++語言
exportGCC_LANGUAGES
#創建/opt/crosstool目錄
mkdir-p$RESULT_TOP
#編譯工具鏈,該過程需要數小時完成。
eval'catarm.datgcc-3.3.6-glibc-2.3.2.dat'shall.sh--notest
echoDone.

在arm.sh腳本文件中需要注意arm-xscale.dat和gcc-3.3.6-glibc-2.3.2.dat兩個文件,這兩個文件是作為Crosstool的編譯的配置文件。其中arm.dat文件內容如下,主要用於定義配置文件、定義生成編譯工具鏈的名稱以及定義編譯選項等。

KERNELCONFIG='pwd'/arm.config#內核的配置
TARGET=arm-linux#編譯生成的工具鏈名稱
TARGET_CFLAGS="-O"#編譯選項


gcc-3.3.6-glibc-2.3.2.dat文件內容如下,該文件主要定義編譯過程中所需要的庫以及它定義的版本,如果在編譯過程中發現有些庫不存在時,Crosstool會自動在相關網站上下載,該工具在這點上相對比較智能,也非常有用。

BINUTILS_DIR=binutils-2.19
GCC_DIR=gcc-3.3.6
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.10-8(根據實際情況填寫)
GDB_DIR=gdb-6.5

將Crosstool的腳本文件和配置文件准備好之後,開始執行arm.sh腳本來編譯交叉編譯工具。具體執行命令如下:

#cdcrosstool-0.43
#./arm.sh

經過數小時的漫長編譯之後,會在/opt/crosstool目錄下生成新的交叉編譯工具,其中包括以下內容:

arm-linux-addr2linearm-linux-g++arm-linux-ldarm-linux-size
arm-linux-ararm-linux-gccarm-linux-nmarm-linux-strings
arm-linux-asarm-linux-gcc-3.3.6arm-linux-objarm-linux-strip
arm-linux-c++arm-linux-gccbugarm-linux-objmpfix-embedded-paths
arm-linux-c++filtarm-linux-gcovarm-linux-ranlib
arm-linux-cpparm-linux-gprofarm-linux-readelf

然後將生成的編譯工具鏈路徑添加到環境變數PATH上去,添加的方法是在系統/etc/ bashrc文件的最後添加下面一行,在bashrc文件中添加環境變數

export PATH=/home/jiabing/gcc-3.3.6-glibc-2.3.2/arm-linux-bin/bin:$PATH

至此,arm-linux下的交叉編譯工具鏈已經完成,現在就可以使用arm-linux-gcc來生成試驗箱上的程序了!












Ⅲ 什麼是嵌入式linux交叉工具鏈

在編譯軟體的時候,會用到(鏈接)一些平台相關的類庫,如果是在本地運行的話,一般不用作特殊處理,但由於嵌入式軟體的運行平台不是本地,所以要做一些特殊處理,讓編譯環境信賴的類庫脫離本地信賴,使用嵌入式平台的類庫來進行鏈接,處理這一過程就叫作交叉編譯工具鏈。
不只是嵌入式要用到交叉編譯工具,跨平台編譯也要使用交叉編譯工具鏈,如linux編譯win32軟體,linu 32位系統編譯linux64位軟體等等。它們的部署原理都是一樣的。

閱讀全文

與製作linux交叉編譯工具鏈相關的資料

熱點內容
fetchrowphp 瀏覽:520
灰色的c語言編譯器 瀏覽:12
消除類游戲演算法 瀏覽:774
php前補零 瀏覽:731
演算法推薦廣告倫理問題 瀏覽:921
亞馬遜雲伺服器的選擇 瀏覽:810
單片機頻率發生器 瀏覽:732
備份與加密 瀏覽:625
用什麼app可以看論壇 瀏覽:54
javajdbcmysql連接 瀏覽:473
製作linux交叉編譯工具鏈 瀏覽:752
編程負數除以正數 瀏覽:512
app和aso有什麼區別 瀏覽:326
手機vmap是什麼文件夾 瀏覽:36
塔科夫鎖服如何選擇伺服器 瀏覽:290
消費者生產者問題java 瀏覽:61
程序員筱柒顧默結婚的時候 瀏覽:578
安卓截長屏怎麼弄 瀏覽:477
優信辦理解壓手續怎麼那麼慢 瀏覽:609
私有雲伺服器一體機安全嗎 瀏覽:430