當前位置:編程學習大全網 - 源碼下載 - Linux嵌入式交叉編譯工具鏈問題 淺談

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。

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

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

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

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

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

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

下載所需的源代碼包

建立工作目錄

建立環境變量

編譯、安裝Binutils

獲取內核頭文件?

編譯gcc的輔助編譯器

編譯生成glibc庫

編譯生成完整的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?–xvzf?crosstool-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?#?定義工具鏈的安裝目錄

export?TARBALLS_DIR?RESULT_TOP

GCC_LANGUAGES="c,c++"#?定義支持C,?C++語言

export?GCC_LANGUAGES

#?創建/opt/crosstool目錄

mkdir?-p?$RESULT_TOP

#?編譯工具鏈,該過程需要數小時完成。

eval?'cat?arm.dat?gcc-3.3.6-glibc-2.3.2.dat'?sh?all.sh?--notest

echo?Done.建立配置文件

在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腳本來編譯交叉編譯工具。具體執行命令如下:

#?cd?crosstool-0.43

#?./arm.sh

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

arm-linux-addr2line?arm-linux-g++arm-linux-ld?arm-linux-size

arm-linux-ararm-linux-gcc?arm-linux-nm?arm-linux-strings

arm-linux-asarm-linux-gcc-3.3.6?arm-linux-objcopy?arm-linux-strip

arm-linux-c++?arm-linux-gccbug?arm-linux-objdump?fix-embedded-paths

arm-linux-c++filt?arm-linux-gcov?arm-linux-ranlib

arm-linux-cpp?arm-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來生成試驗箱上的程序了!

  • 上一篇:Object.prototype.toString.call()、Array.prototype.toString.call()、toString()
  • 下一篇:我想買個新手機,價格在800~2200的,有什麽好的手機推薦嗎,我喜歡電池經久耐用的,還有不是很卡
  • copyright 2024編程學習大全網