約定
注意: 除非另有指定,本文檔假定:
- 以
ARM Cortex-M3
處理器的小端模式 ARM EABI
應用二進制接口GNU GCC
工具鏈
工具鏈
一個完整的軟件工具鏈包括如下程序: 將源代碼轉化為二進制機器碼;將單獨的匯編/編譯的代碼模塊鏈接到一起;反匯編二進制代碼;轉換格式。
以匯編源碼文件作為起始文件,.s
文件,經過匯編器匯編生成 .o
目標文件,目標文件與鏈接文件 .ld
文件進行鏈接,通過鏈接器生成可執行文件,並進一步生成 .bin
文件以及可反匯編的 .lst
文件。
一個典型的 GNU
匯編工具鏈包括上面的過程,以及下面的程序:
as
作為匯編器,將高級編程語言轉換為二進制機器碼。它通常以.s
作為輸入,輸出.o
目標文件ld
作為鏈接器,解析多個目標文件的外部符號引用並分配數據段,輸出一個單個的可執行文件。它通常以.o
目標文件以及.ld
鏈接腳本作為輸入,以.out
可執行文件作為輸出objcopy
將.bin
文件復制並轉化為.bin
文件objdump
通常用來反匯編
以 C/C++ 作為源碼
如果你希望寫 C/C++
文件或混合 匯編/C
代碼,編譯時,你需要編譯器。GNU Compiler Collection (GCC)
包含所有的工具。C/C++
編譯器 (gcc/g++) 以 C/C++
作為源碼,以及預匯編的目標感i奧文件,以及預編譯的二進制文件,以這些輸入生成目標文件,輸出可執行文件。
在這個過程中會用到如下的程序:
ar
從文檔中創建、調整、提取出實例nlmconv
將目標代碼轉化為NLM
nm
從目標文件中列出符號ranlib
從文檔中生成一個內容索引readelf
從ELF
格式的目標文件中展示信息size
展示目標或文檔的段以及他們的大小strip
忽略嵌入到目標文件中的符號
安裝
開發新的硬件平台的軟件,第一步是安裝開發軟件需要的工具鏈。包括確定安裝匯編器、鏈接器、編譯器、軟件庫、仿真器、程序以及其他目標架構支持的工具。在本例中,我們的目標是 ARM Cortex-M3
處理器,基於 ARMv7
架構。考慮到花費的代價以及可獲取程度,我們這里使用 GNU GCC
編譯鏈。GCC
是極受歡迎的開源工具鏈,可以用在諸如 Intel x86
,ARM v4/5/6/7
,TI MSP
,Atmel AVR
等架構的設備上。因為大部分 GCC
工具是可以免費下載的,它們可以被任何人使用。注意: 當開發用的主機與目標架構不同時,會將工具鏈稱為 交叉編譯鏈
(即,如果你希望在基於 x86
的架構的 Linux
設備上開發 ARM
架構的軟件,那么你需要這么一個交叉編譯鏈)。
Unix
交叉編譯器的名命傳統可能會令人迷惑。如果你想要查找一個 ARM
編譯器,那么你可能找到如下幾個工具鏈: arm-none-linux-gnueabi
,arm-none-eabi
,arm-eabi
,以及 arm-softfloat-linux-gnu
。Unix
交叉編譯器使用如下的名命方式: arch
,[-vendor]
,[-os]
,-abi
。其中:
arch
為目標架構,在我們的示例情景下是ARM
vendor
為工具鏈提供者os
為目標操作系統,如果有的話,用來決定鏈接以及系統調用應用的庫 (比如:newlib
,glibc
,crt0
等)abi
指定使用應用程序二進制接口,確保不同的工具生成的二進制內容可以進行交互操作
下面的一些例子解釋:
arm-none-eabi
目標架構為ARM
架構,沒有提供者,目標不為操作系統(即,目標為裸機程序),並遵守ARM EABI
arm-none-linux-gnueabi
是可以安裝到基於Debian
的系統 (使用包管理工具apt
,包名為gcc-arm-linux-gnueabi
)。這個工具鏈目標為ARM
架構,沒有提供者,創建運行在Linux
操作系統上的可執行程序,遵守GNU EABI
arm-eabi
安卓ARM
編譯器
安裝編譯鏈
對於 linux
系統,只需要將編譯鏈所在的路徑導入到環境變量 PATH
中即可,如下命令:
export PATH="tool_chain/bin_path/:$PATH"
當然這一種安裝方式只是臨時的安裝,只在當前終端下有效。如果希望啟動就生效,一種選擇是寫入到啟動腳本中,比如 ubuntu
中編輯 /etc/profile
文件。