製作交叉編譯工具鏈概述
要做嵌入式Linux開發,首先需要有交叉編譯工具鏈(cross compiling toolchain),也就是在主機(x86 PC)上可編譯生成目標板可執行檔案(ARM指令)的編譯工具。和普通的編譯工具鏈一樣,交叉編譯工具鏈也包括編譯、連結、修改目標檔案的各種程式,如 gcc、glibc、ld、gas、objdump、readelf等等。交叉編譯工具鏈本身也是需要編譯生成的,要得到一套完整的交叉編譯工具鏈需要編譯以下原始碼包:
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-gcc、arm-linux-ld、arm-linux-readelf等等,需要設定PATH環境變數使系統能找到這些程式。
http://qgjie456.blog.163.com/blog/static/354513672007624901820/
相關文章
- ubuntu下編譯交叉編譯工具鏈Ubuntu編譯
- 交叉編譯工具鏈構建原理編譯
- 全網可用交叉編譯工具鏈大全編譯
- Android NDK 提供的交叉工具鏈手動編譯原始碼Android編譯原始碼
- Go語言交叉編譯工具goxGo編譯
- 交叉編譯編譯
- i.MX6ULL開發板-Buildroot製作交叉編譯器UI編譯
- 關於Gdb工具的交叉編譯、移植編譯
- lazarus交叉編譯編譯
- GDB交叉編譯編譯
- golang交叉編譯Golang編譯
- 交叉編譯入門編譯
- go 交叉編譯,部署Go編譯
- 淺談交叉編譯編譯
- Go 編譯和工具鏈Go編譯
- 交叉編譯和 RPC編譯RPC
- wifidog交叉編譯WiFi編譯
- android NDK 交叉編譯Android編譯
- golang初學:交叉編譯Golang編譯
- Rust 交叉編譯與條件編譯總結Rust編譯
- 交叉編譯-Mac環境使用NDK編譯FFmpeg編譯Mac
- 編譯器的自展和自舉、交叉編譯編譯
- Windows下Linux開發環境設定(二)--安裝Cygwin及交叉編譯工具鏈WindowsLinux開發環境編譯
- 編譯原理概述編譯原理
- Go跨平臺交叉編譯Go編譯
- linux與windows交叉編譯LinuxWindows編譯
- 交叉編譯mupdf1.15.0編譯
- Go - armv7 交叉編譯Go編譯
- Ubuntu交叉編譯環境配置Ubuntu編譯
- 交叉編譯和交叉除錯環境搭建及使用編譯除錯
- 重走LFS之路:(四) 工具鏈編譯-1編譯
- 重走LFS之路:(五) 工具鏈編譯-2編譯
- 重走LFS之路:(六) 工具鏈編譯-3編譯
- protobuf 的交叉編譯使用(C++)編譯C++
- 如何製作一款線上編譯器編譯
- Tinyx 交叉編譯配置檔案(arm版)編譯
- ubuntu16交叉編譯Qt5.9Ubuntu編譯QT
- iOS攻防:ssh登陸與交叉編譯iOS編譯