製作交叉編譯工具鏈概述

zm_21發表於2014-05-16

要做嵌入式Linux開發,首先需要有交叉編譯工具鏈(cross compiling toolchain),也就是在主機(x86 PC)上可編譯生成目標板可執行檔案(ARM指令)的編譯工具。和普通的編譯工具鏈一樣,交叉編譯工具鏈也包括編譯、連結、修改目標檔案的各種程式,如 gccglibcldgasobjdumpreadelf等等。交叉編譯工具鏈本身也是需要編譯生成的,要得到一套完整的交叉編譯工具鏈需要編譯以下原始碼包:

1. binutils

2. gcc

3. glibc

4. linux(核心)

5. linux-libc-headers

6. glibc-linuxthreads

這些原始碼包具有非常強的版本依賴關係,如果原始碼包的版本不匹配,在編譯過程中會出現各種各樣的問題,有些問題需要對原始碼做些修改或者打補丁,有些問題則是沒有解決辦法的。所以原始碼包的版本要非常匹配,必要時要對原始碼做適當的修改。編譯的步驟也是比較複雜的,主要有以下幾步[1]

1. 根據目標平臺配置核心原始碼,生成核心標頭檔案

2. 編譯binutils

3. 編譯器的自舉(bootstrap),也就是先編譯出gcc的部分功能(沒有glibc支援,只有C編譯器沒有C++編譯器)

4. 編譯glibc

5. 編譯完整的gcc

幸運的是,已經有人寫出了製作交叉編譯器的指令碼( http://www.kegel.com/crosstool ),該指令碼中提供了一系列原始碼包版本的匹配方案,使用者需要選擇目標平臺和原始碼包的版本匹配方案(比如筆者選擇通用arm平臺gcc-4.0.2-glibc-2.3.6),執行該指令碼會自動從官方網站( http://www.gnu.org http://www.kernel.org )下載原始碼然後自動完成所有的編譯步驟。

注意 筆者在Ubuntu系統上執行該指令碼,到編譯glibc時出錯,經查原因是glibc中的指令碼有不符合POSIX標準的用法。用bash執行該指令碼是沒問題的,但Ubuntu系統的/bin/sh預設是指向dash的,dash沒有bash那樣豐富的互動功能,但是執行指令碼時非常高效並且其實現完全遵守POSIX標準,然而現存的很多指令碼有不符合POSIX標準的用法,解決的辦法是把/bin/sh重新指向bash

此外,網上也可下載到已編譯好的交叉編譯工具鏈,比如 http://www.snapgear.org/snapgear/downloads.html ,但是使用別人編譯好的交叉編譯工具鏈有很多限制,不能按自己的特殊需要對其定製,比如需要soft-float的編譯器(生成指令模擬浮點數運算)。

筆者的編譯器是安裝在/usr/local/arm-linux/下的,程式檔名字首是arm-linux-,也就是arm-linux-gccarm-linux-ldarm-linux-readelf等等,需要設定PATH環境變數使系統能找到這些程式。

 

http://qgjie456.blog.163.com/blog/static/354513672007624901820/

相關文章