當前位置:首頁 » 編程軟體 » linux編譯工具鏈

linux編譯工具鏈

發布時間: 2023-01-10 20:36:03

linux交叉編譯工具鏈和GCC是什麼關系啊

編譯工具鏈一般最簡化的為
binutils
+
gcc
+
glibc
+
kernel-header
組合的環境。
GCC
就是編譯器,他的輸出每次安裝只能有針對一個架構的指令輸出。如果要多個架構輸出,那就要裝多個
GCC
,所以編譯工具鏈裡面會有一個
GCC

交叉編譯就是跨架構編譯,編譯出來的程序不能在本機執行(當然有例外情況)。所以這個時候就需要交叉編譯工具鏈。
工具鏈光有
GCC
是不行的,還需要一個
binutils
的二進制連接器,以及一個最基本的目標架構的
C
庫,C
庫還需要一個目標架構的內核源代碼才能完全工作(當然不是必須的,但編譯有的時候需要)
又因為
GCC
、binutils
不能實現單軟體同時多架構輸出,所以需要單獨另裝,又加上
C
庫和內核頭文件需要目標架構的東西而不能用本機本地架構的數據。
所以一個交叉編譯工具鏈就是針對目標架構准備的單獨安裝單獨使用的
binutils
+
gcc
+
glibc
+
kernel-header
的集合了。
PS:這個
kernel-header
並不一定就是
Linux
,他還可以是別的系統核心開發庫,比如
FreeBSD

㈡ 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上的arm-linux交叉編譯工具鏈的問題:但是arm也有很多種啊! 這個工具是對所有的ARM都支持嗎

由於交叉編譯器中每個組件都有各自的版本,所以可以使用不同版本的組件來製作交叉編譯器。但是,組件之間會因版本不匹配的問題而產生錯誤。為了避免這種麻煩,建議直接使用製作好的arm-linux交叉編譯器。你優化arm9,應該是想升級內核吧,升級內核有相應的命令的。

㈣ LINUX交叉編譯工具鏈和GCC是什麼關系啊

編譯工具鏈一般最簡化的為
binutils
+
gcc
+
glibc
+
kernel-header
組合的環境。
GCC
就是編譯器,他的輸出每次安裝只能有針對一個架構的指令輸出。如果要多個架構輸出,那就要裝多個
GCC
,所以編譯工具鏈裡面會有一個
GCC

交叉編譯就是跨架構編譯,編譯出來的程序不能在本機執行(當然有例外情況)。所以這個時候就需要交叉編譯工具鏈。
工具鏈光有
GCC
是不行的,還需要一個
binutils
的二進制連接器,以及一個最基本的目標架構的
C
庫,C
庫還需要一個目標架構的內核源代碼才能完全工作(當然不是必須的,但編譯有的時候需要)
又因為
GCC
、binutils
不能實現單軟體同時多架構輸出,所以需要單獨另裝,又加上
C
庫和內核頭文件需要目標架構的東西而不能用本機本地架構的數據。
所以一個交叉編譯工具鏈就是針對目標架構准備的單獨安裝單獨使用的
binutils
+
gcc
+
glibc
+
kernel-header
的集合了。
PS:這個
kernel-header
並不一定就是
Linux
,他還可以是別的系統核心開發庫,比如
FreeBSD

㈤ 嵌入式Linux中,製作交叉編譯工具鏈的問題

還是許可權問題吧,你用lsattr看看。如果是attr問題,你用chattr修改就可以了。

㈥ 嵌入式Linux中,製作交叉編譯工具鏈的問題

ln: creating hard link `libintl.h' to `/mnt/hgfs/share/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6/binutils-2.15/intl/libgettext.h': Operation not permitted

創建硬鏈接失敗,可能是操作許可權的問題,或者你要創建連接的位置的文件系統與目標文件系統不同。
這只是這里的錯誤,但一般這種錯誤都是由前面的configure或make的參數設置不正確導致的。

㈦ 交叉編譯openssl for arm-linux-androideabi-gcc工具鏈

在Ubuntu 16.04 64bit上搭建的android編譯環境交叉編譯SDK的openssl-1.0.2j生成庫,但是使用ndk-build時,卻出現了「Fatal error: Invalid -march= option: `armv5te'」錯誤

android-ndk-r10e 的交叉編譯鏈在Ubuntu 16.04 32bit系統上沒有問題,後來網路搜索後嘗試了各種方法還是找不到問題所在,最後在 CSDN問答 這邊找到了相關描述,果不其然,升級了交叉編譯鏈 android-ndk-r12b 後編譯就通過了。

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

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

㈨ Linux工具鏈是什麼

一般linux工具鏈的是指的是GNU 開發工具鏈

是指 GNU Compiler Collection(gcc)GNU libc (glibc)以及用來編譯、測試和分析軟體的 GNU binutils (binutils)。

他是自依賴的, 也就是說 他構成了一個編譯,測試,安裝的完整體,使用這個工具鏈可以很容易從0開始創建一個GNU/Linux系統

㈩ 如何在linux平台構建基於newlib工具鏈

交叉編譯通俗地講就是在一種平台上編譯出能運行在體系結構不同的另一種平台上的程式,比如在PC平台(X86 CPU)上編譯出能運行在以ARM為內核的CPU平台上的程式,編譯得到的程式在X86 CPU平台上是不能運行的,必須放到ARM CPU平台上才能運行,雖然兩個平台用的都是Linux系統。這種方法在異平台移植和嵌入式研發時非常有用。相對和交叉編譯,平常做的編譯叫本地編譯,也就是在當前平台編譯,編譯得到的程式也是在本地執行。用來編譯這種跨平台程式的編譯器就叫交叉編譯器,相對來說,用來做本地編譯的工具就叫本地編譯器。所以要生成在目標機上運行的程式,必須要用交叉編譯工具鏈來完成。在裁減和制定Linux內核用於嵌入式系統之前,由於一般嵌入式研發系統存儲大小有限,通常都要在性能優越的PC上建立一個用於目標機的交叉編譯工具鏈,用該交叉編譯工具鏈在PC上編譯目標機上要運行的程式。交叉編譯工具鏈是個由編譯器、連接器和解釋器組成的綜合研發環境,交叉編譯工具鏈主要由binutils、gcc和glibc 3個部分組成。有時出於減小 libc 庫大小的考慮,也能用別的 c 庫來代替 glibc,例如 uClibc、dietlibc 和 newlib。建立交叉編譯工具鏈是個相當復雜的過程,如果不想自己經歷復雜繁瑣的編譯過程,網上有一些編譯好的可用的交叉編譯工具鏈能下載,但就以學習為目的來說讀者有必要學習自己製作一個交叉編譯工具鏈。本章通過具體的實例講述基於ARM的嵌入式Linux交叉編譯工具鏈的製作過程。 構建交叉編譯器的第一個步驟就是確定目標平台。在GNU系統中,每個目標平台都有一個明確的格式,這些信息用於在構建過程中識別要使用的不同工具的正確版本。因此,當在一個特定目標機下運行GCC時,GCC便在目錄路徑中查找包含該目標規范的應用程式路徑。GNU的目標規范格式為CPU-PLATFORM-OS。例如x86/i386 目標機名為i686-pc-linux-gnu。本章的目的是講述建立基於ARM平台的交叉工具鏈,所以目標平台名為arm-linux-gnu。 通常構建交叉工具鏈有3種方法。 方法一 分步編譯和安裝交叉編譯工具鏈所需要的庫和原始碼,最終生成交叉編譯工具鏈。該方法相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用方法二或方法三構建交叉工具鏈。 方法二 通過Crosstool腳本工具來實現一次編譯生成交叉編譯工具鏈,該方法相對於方法一要簡單許多,並且出錯的機會也非常少,建議大多數情況下使用該方法構建交叉編譯工具鏈。 方法三 直接通過網上(ftp.arm.kernel.org.uk)下載已製作好的交叉編譯工具鏈。該方法的好處不用多說,當然是簡單省事,但和此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的沒有靈活性,所以構建所用的庫及編譯器的版本也許並不適合你要編譯的程式,同時也許會在使用時出現許多莫名的錯誤,建議讀者慎用此方法。 為了讓讀者真正的學習交叉編譯工具鏈的構建,下面將重點周詳地介紹前兩種構建ARM Linux交叉編譯工具鏈的方法。 2.2.1 分步構建交叉編譯鏈 分步構建,顧名思義就是一步一步地建立交叉編譯鏈,不同於2.2.2節中講述的Crosstool腳本工具一次編譯生成的方法,該方法適合那些希望深入學習了解構建交叉編譯工具鏈的讀者。該方法相對來說難度較大,通常情況下困難重重,猶如唐僧西天取經,不過本文會盡可能周詳地介紹構建的每一個步驟,讀者完萬能根據本節的內容自己獨立實踐,構建自己的交叉工具鏈。該過程所需的時間較長,希望讀者有較強的耐心和毅力去學習和實踐他,通過實踐能使讀者更加清晰交叉編譯器的構建過程及各個工具包的作用。該方法所需資源如表2.1所示。 表2.1 所需資源 安裝包 下載地址 安裝包 下載地址 linux-2.6.10.tar.gz ftp.kernel.org glibc-2.3.2.tar.gz ftp.gnu.org binutils-2.15.tar.bz2 ftp.gnu.org glibc-linuxthreads-2.3.2.tar.gz ftp.gnu.org gcc-3.3.6.tar.gz ftp.gnu.org 通過相關站點下載以上資源後,就能開始建立交叉編譯工具鏈了。 1.建立工作目錄 首先建立工作目錄,工作目錄就是在什麼目錄下構建交叉工具鏈,目錄的構建一般沒有特別的需求,能根據個人喜好建立。以下所建立的目錄是作者自定義的,當前的用戶定義為mike,因此用戶目錄為/home/mike,在用戶目錄下首先建立一個工作目錄(armlinux),建立工作目錄的命令行操作如下: # cd /home/mike # mkdir armlinux 再在這個工作目錄armlinux下建立3個目錄 build-tools、kernel 和 tools。具體操作如下: # cd armlinux # mkdir build-tools kernel tools 其中各目錄的作用如下。 ● build-tools 用來存放下載的binutils、gcc、glibc等原始碼和用來編譯這些原始碼的目錄; ● kernel 用來存放內核原始碼; ● tools 用來存放編譯好的交叉編譯工具和庫文件。 2.建立環境變數 該步驟的目的是為了方便重復輸入路徑,因為重復操作每件相同的事情總會讓人覺得非常麻煩,如果讀者不習慣使用環境變數就能略過該步,直接輸入絕對路徑就能。聲明以下環境變數的目的是在之後編譯工具庫的時候會用到,非常方便輸入,尤其是能降低輸錯路徑的風險。 # export PRJROOT=/home/mike/armlinux # export TARGET=arm-linux # export PREFIX=$PRJROOT/tools # export TARGET_PREFIX=$PREFIX/$TARGET # export PATH=$PREFIX/bin:$PATH 注意,用export聲明的變數是臨時的變數,也就是當注銷或更換了控制台,這些環境變數就消失了,如果還需要使用這些環境變數就必須重復export操作,所以有時會非常麻煩。值得慶幸的是,環境變數也能定義在bashrc文件中,這樣當注銷或更換控制台時,這些變數就一直有效,就不用老是export這些變數了。 3.編譯、安裝Binutils Binutils是GNU工具之一,他包括連接器、匯編器和其他用於目標文件和檔案的工具,他是二進制代碼的處理維護工具。安裝Binutils工具包含的程式有addr2line、ar、as、c++filt、gprof、ld、nm、obj、objmp、ranlib、readelf、size、strings、strip、libiberty、libbfd和libopcodes。對這些程式的簡單解釋如下。 ● addr2line 把程式地址轉換為文件名和行號。在命令行中給他一個地址和一個可執行文件名,他就會使用這個可執行文件的調試信息指出在給出的地址上是哪個文件及行號。 ● ar 建立、修改、提取歸檔文件。歸檔文件是包含多個文件內容的一個大文件,其結構確保了能恢復原始文件內容。 ● as 主要用來編譯GNU C編譯器gcc輸出的匯編文件,產生的目標文件由連接器ld連接。 ● c++filt 連接器使用他來過濾 C++ 和 Java 符號,防止重載函數沖突。 ● gprof 顯示程式調用段的各種數據。 ● ld 是連接器,他把一些目標和歸檔文件結合在一起,重定位數據,並連接符號引用。通常,建立一個新編譯程式的最後一步就是調用ld。 ● nm 列出目標文件中的符號。 ● obj 把一種目標文件中的內容復制到另一種類型的目標文件中。 ● objmp 顯示一個或更多目標文件的信息。使用選項來控制其顯示的信息,他所顯示的信息通常只有編寫編譯工具的人才感興趣。 ● ranlib 產生歸檔文件索引,並將其保存到這個歸檔文件中。在索引中列出了歸檔文件各成員所定義的可重分配目標文件。 ● readelf 顯示elf格式可執行文件的信息。 ● size 列出目標文件每一段的大小及總體的大小。默認情況下,對於每個目標文件或一個歸檔文件中的每個模塊只產生一行輸出。 ● strings 列印某個文件的可列印字元串,這些字元串最少4個字元長,也能使用選項-n設置字元串的最小長度。默認情況下,他只列印目標文件初始化和可載入段中的可列印字元;對於其他類型的文件他列印整個文件的可列印字元。這個程式對於了解非文本文件的內容非常有幫助。 ● strip 丟棄目標文件中的全部或特定符號。 ● libiberty 包含許多GNU程式都會用到的函數,這些程式有getopt、obstack、strerror、strtol和strtoul。 ● libbfd 二進制文件描述庫。 ● libopcode 用來處理opcodes的庫,在生成一些應用程式的時候也會用到他。 Binutils工具安裝依賴於Bash、Coreutils、Diffutils、GCC、Gettext、Glibc、Grep、Make、Perl、Sed、Texinfo等工具。 介紹完Binutils工具後,下面將分步介紹安裝binutils-2.15的過程。 首先解壓binutils-2.15.tar.bz2包,命令如下: # cd $PRJROOT/build-tools # tar -xjvf binutils-2.15.tar.bz2 接著設置Binutils工具,建議建立一個新的目錄用來存放設置和編譯文件,這樣能使源文件和編譯文件獨立開,具體操作如下: # cd $PRJROOT/build-tools # mkdir build-binutils # cd build-binutils # ../ binutils-2.15/configure --target=$TARGET --prefix=$PREFIX 其中選項?target的意思是制定生成的是 arm-linux 的工具,--prefix 是指出可執行文件安裝的位置。執行上述操作會出現非常多check信息,最後產生 Makefile 文件。接下來執行make和安裝操作,命令如下: # make # make install 該編譯過程較慢,需要數十分鍾,安裝完成後查看/home/mike/armlinux/tools/bin目錄下的文件,如果查看結果如下,表明此時Binutils工具已安裝結束。 # ls $PREFIX/bin arm-linux-addr2line arm-linux-ld arm-linux-ranlib arm-linux-strip arm-linux-ar arm-linux-nm arm-linux-readelf arm-linux-as arm-linux-obj arm-linux-size arm-linux-c++filt arm-linux-objmp arm-linux-strings 4.獲得內核頭文件 編譯器需要通過系統內核的頭文件來獲得目標平台所支持的系統函數調用所需要的信息。對於Linux內核,最佳的方法是下載一個合適的內核,然後復制獲得頭文件。需要對內核做一個基本的設置來生成正確的頭文件;不過,不必編譯內核。對於本例中的目標arm-linux,需要以下步驟。 (1)在kernel目錄下解壓linux-2.6.10.tar.gz內核包,執行命令如下: # cd $PRJROOT/kernel # tar -xvzf linux-2.6.10.tar.gz (2)接下來設置編譯內核使其生成正確的頭文件,執行命令如下: # cd linux-2.6.10 # make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig 其中ARCH=arm表示是以arm為體系結構,CROSS_COMPILE=arm-linux-表示是以arm-linux-為前綴的交叉編譯器。也能用config和xconfig來代替menuconfig,推薦用make menuconfig,這也是內核研發人員用的最多的設置方法。注意在設置時一定要選擇處理器的類型,這里選擇三星的S3C2410(System Type->ARM System Type->/Samsung S3C2410),如圖2.1所示。設置完退出並保存,檢查一下內核目錄中的include/linux/version.h和include/linux/autoconf.h文件是不是生成了,這是編譯glibc時要用到的,如果version.h 和 autoconf.h 文件存在,說明生成了正確的頭文件。 screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt=』Click here to open new window\nCTRL+Mouse wheel to zoom in/out』;}" border=0> 圖2.1 Linux 2.6.10內核設置界面 復制頭文件到交叉編譯工具鏈的目錄,首先需要在/home/mike/armlinux/tools/arm-linux目錄下建立工具的頭文件目錄inlcude,然後復制內核頭文件到此目錄下,具體操作如下: # mkdir -p $TARGET_PREFIX/include # cp -r $PRJROOT/kernel/linux-2.6.10/include/linux $TARGET_PREFIX/include # cp -r $PRJROOT/kernel/linux-2.6.10/include/asm-arm $TARGET_PREFIX/include/asm 5.編譯安裝boot-trap gcc 這一步的目的主要是建立arm-linux-gcc工具,注意這個gcc沒有glibc庫的支持,所以只能用於編譯內核、BootLoader等不必C庫支持的程式,後面創建C庫也要用到這個編譯器,所以創建他主要是為創建C庫做准備,如果只想編譯內核和BootLoader,那麼安裝完這個就能到此結束。安裝命令如下: # cd $PRJROOT/build-tools # tar -xvzf gcc-3.3.6.tar.gz # mkdir build-gcc # cd gcc-3.3.6 # vi gcc/config/arm/t-linux 由於是第一次安裝ARM交叉編譯工具,沒有支持libc庫的頭文件,所以在gcc/config/arm/t- linux文件中給變數TARGET_LIBGCC2_CFLAGS增加操作參數選項-Dinhibit_libc -D__gthr_ posix_h來屏蔽使用頭文件,否則一般默認會使用/usr/inlcude頭文件。 將TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer ?fPIC改為TARGET_LIBGCC2- CFLAGS=-fomit-frame-pointer-fPIC -Dinhibit_libc -D__gthr_posix_h 修改完t-linux文件後保存,緊接著執行設置操作,如下命令: # cd build-gcc # ../ build-gcc /configure --target=$TARGET --prefix=$PREFIX --enable-languages=c --disable-threads --disable-shared 其中選項--enable-languages=c表示只支持C語言,--disable-threads表示去掉thread功能,這個功能需要glibc的支持。--disable-shared表示只進行靜態庫編譯,不支持共享庫編譯。 接下來執行編譯和安裝操作,命令如下: # make # make install 安裝完成後,在/home/mike/armlinux/tools/bin下查看,如果arm-linux-gcc等工具已生成,表示boot-trap gcc工具已安裝成功。 6.建立glibc庫 glibc是GUN C庫,他是編譯Linux系統程式非常重要的組成部分。安裝glibc-2.3.2版本之前推薦先安裝以下的工具: ● GNU make 3.79或更新; ● GCC 3.2或更新; ● GNU binutils 2.13或更新。 首先解壓glibc-2.2.3.tar.gz和glibc-linuxthreads-2.2.3.tar.gz原始碼,操作如下: # cd $PRJROOT/build-tools # tar -xvzf glibc-2.2.3.tar.gz # tar -xzvf glibc-linuxthreads-2.2.3.tar.gz --directory=glibc-2.2.3 然後進行編譯設置,glibc-2.2.3設置前必須新建一個編譯目錄,否則在glibc-2.2.3目錄下不允許進行設置操作,此處在$PRJROOT/build-tools目錄下建立名為build-glibc的目錄,設置操作 如下: # cd $PRJROOT/build-tools # mkdir build-glibc # cd build-glibc # CC=arm-linux-gcc ../glibc-2.2.3 /configure --host=$TARGET --prefix="/usr" --enable-add-ons --with-headers=$TARGET_PREFIX/include 選項CC=arm-linux-gcc是把CC(Cross Compiler)變數設成剛編譯完的gcc,用他來編譯glibc。--prefix="/usr"定義了一個目錄用於安裝一些和目標機器無關的數據文件,默認情況下是/usr/local目錄。--enable-add-ons是告訴glibc用linuxthreads包,在上面已將他放入glibc原始碼目錄中,這個選項等價於-enable-add-ons=linuxthreads。--with-headers告訴glibc linux內核頭文件的目錄 位置。 設置完後就能編譯和安裝 glibc了,具體操作如下: # make # make install 7.編譯安裝完整的gcc 由於第一次安裝的gcc沒有交叉glibc的支持,目前已安裝了glibc,所以需要重新編譯來支持交叉glibc。並且上面的gcc也只支持C語言,目前能讓他同時支持C語言還要和C++語言。具體操作如下: # cd $PRJROOT/build-tools/gcc-2.3.6 # ./configure --target=arm-linux --enable-languages=c,c++ --prefix=$PREFIX # make # make install 安裝完成後會發目前$PREFIX/bin目錄下又多了arm-linux-g++ 、arm-linux-c++等文件。 # ls $PREFIX/bin arm-linux-addr2line arm-linux-g77 arm-linux-gnatbind arm-linux-ranlib arm-linux-ar arm-linux-gcc arm-linux-jcf-mp arm-linux-readelf arm-linux-as arm-linux-gcc-3.3.6 arm-linux-jv-scan arm-linux-size arm-linux-c++ arm-linux-gccbug arm-linux-ld arm-linux-strings arm-linux-c++filt arm-linux-gcj arm-linux-nm arm-linux-strip arm-linux-cpp arm-linux-gcjh arm-linux-obj grepjar arm-linux-g++ arm-linux-gcov arm-linux-objmp jar 8.測試交叉編譯工具鏈 到此為止,已介紹完了用分步構建的方法建立交叉編譯工具鏈。下面通過一個簡單的程式測試剛剛建立的交叉編譯工具鏈看是否能夠正常工作。寫一個最簡單的hello.c源文件,內容如下: #include int main( ) { printf(「Hello,world!\n」); return 0; } 通過以下命令進行編譯,編譯後生成名為hello的可執行文件,通過file命令能查看文件的類型。當顯示以下信息時表明交叉工具鏈正常安裝了,通過編譯生成了ARM體系可執行的文件。注意,通過該交叉編譯鏈編譯的可執行文件只能在ARM體系下執行,不能在基於X86的普通PC上執行。 # arm-linux-gcc -o hello hello.c # file hello hello: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.4.3, dynamically linked (uses shared libs), not stripped 2.2.2 用Crosstool工具構建交叉工具鏈 Crosstool是一組腳本工具集,可構建和測試不同版本的gcc和glibc,用於那些支持glibc的體系結構。他也是個開源項目,下載地址是http://kegel.com/crosstool。用Crosstool構建交叉工具鏈要比上述的分步編譯容易得多,並且也方便許多,對於僅僅為了工作需要構建交叉編譯工具鏈的讀者建議使用此方法。用Crosstool工具構建所需資源如表2.2所示。

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:593
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:888
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:582
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:765
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:684
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1013
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:255
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:114
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:806
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:713