@(134 - Linux)
Part 1 交叉編譯簡介
1.1 What is cross-compiling?
對於沒有做過嵌入式編程的人,可能不太理解交叉編譯的概念,那么什么是交叉編譯?它有什么作用?
在解釋什么是交叉編譯之前,先要明白什么是本地編譯。
本地編譯
本地編譯可以理解為,在當前編譯平台下,編譯出來的程序只能放到當前平台下運行。平時我們常見的軟件開發,都是屬於本地編譯:
比如,我們在 x86 平台上,編寫程序並編譯成可執行程序。這種方式下,我們使用 x86 平台上的工具,開發針對 x86 平台本身的可執行程序,這個編譯過程稱為本地編譯。
交叉編譯
交叉編譯可以理解為,在當前編譯平台下,編譯出來的程序能運行在體系結構不同的另一種目標平台上,但是編譯平台本身卻不能運行該程序:
比如,我們在 x86 平台上,編寫程序並編譯成能運行在 ARM 平台的程序,編譯得到的程序在 x86 平台上是不能運行的,必須放到 ARM 平台上才能運行。
(Host 生成的程序不能在Host 平台上運行而只能放到Target平台運行)
1.2 為什么會有交叉編譯
之所以要有交叉編譯,主要原因是:
- Speed: 目標平台的運行速度往往比主機慢得多,許多專用的嵌入式硬件被設計為低成本和低功耗,沒有太高的性能
- Capability: 整個編譯過程是非常消耗資源的,嵌入式系統往往沒有足夠的內存或磁盤空間
- Availability: 即使目標平台資源很充足,可以本地編譯,但是第一個在目標平台上運行的本地編譯器總需要通過交叉編譯獲得
- Flexibility: 一個完整的Linux編譯環境需要很多支持包,交叉編譯使我們不需要花時間將各種支持包移植到目標板上
1.3 為什么交叉編譯比較困難
交叉編譯的困難點在於兩個方面:
1)不同的體系架構擁有不同的機器特性
- Word size: 是64位還是32位系統
- Endianness: 是大端還是小端系統
- Alignment: 是否必修按照4字節對齊方式進行訪問
- Default signedness: 默認數據類型是有符號還是無符號
- NOMMU: 是否支持MMU
2)交叉編譯時的主機環境與目標環境不同
- Configuration issues
- HOSTCC vs TARGETCC
- Toolchain Leaks
- Libraries
- Testing
詳細的對比可以參看這篇文章,已經寫的很詳細了,在這就不細說了:Introduction to cross-compiling for Linux
第 2 章 交叉編譯鏈
明白了什么是交叉編譯,那我們來看看什么是交叉編譯鏈。
注意:嚴格意義上來說,交叉編譯器,只是指交叉編譯的gcc,但是實際上為了方便,我們常說的交叉編譯器就是交叉工具鏈。本文對這兩個概念不加以區分,都是指編譯鏈
首先編譯過程是按照不同的子功能,依照先后順序組成的一個復雜的流程,如下圖:
編譯流程
那么編譯過程包括了預處理、編譯、匯編、鏈接等功能。既然有不同的子功能,那每個子功能都是一個單獨的工具來實現,它們合在一起形成了一個完整的工具集。
同時編譯過程又是一個有先后順序的流程,它必然牽涉到工具的使用順序,每個工具按照先后關系串聯在一起,這就形成了一個鏈式結構。
因此,交叉編譯鏈就是為了編譯跨平台體系結構的程序代碼而形成的由多個子工具構成的一套完整的工具集。同時,它隱藏了預處理、編譯、匯編、鏈接等細節,當我們指定了源文件(.c)時,它會自動按照編譯流程調用不同的子工具,自動生成最終的二進制程序映像(.bin)。
參考鏈接:https://blog.csdn.net/pengfei240/article/details/52912833