工作上用了這麼久的cross compile環境總是人家準備好的
所以筆記一下過程好讓自己也可以熟悉怎麼打造一個開發環境
大致上的方法可以參考http://www.gnuarm.com/
要準備cross compile環境, 須準備底下幾個pkg
binutils
gcc
newlib
這些pkg都需要把他build成support ARM的binary.
所以這邊的作法都是去抓source來compile成for ARM的pkg
binutils抓的是binutils-2.20.1
1. Compile binutils from source
./configure --target=arm-elf --prefix=/toolchain/arm-elf --enable-interwork --enable-multilib
參數解釋如下:
A. --target
這裡分成兩種格式 arm-elf 與 arm-linux
參數 arm-linux 所產生的binutils, 在產生target的binary code時會去調用linux所使用的glibc library (for target)
並作dynamic link, 所產生出的binary code適用於有linux os存在的環境
參數 arm-elf 所產生的bintuils, 在產生target的binary code時則不會去調用glibc, 可以自己選擇newlib或uClibc
為static link
Glibc的code size比較大(為了與linux作搭配), 所以除非是要開發linux based的嵌入式環境,
不然大部分會為了省空間而選擇newlib (這部分也有考量到license問題, Glibc是LGPL, newlib是BSD)
當然若要用arm-elf 搭配 static glibc也是可以, 但就是會有license問題 (static link就要公開source code了)
在linux上把glibc弄成dynamic link就是為了解決license的問題
B. --prefix
這個參數是用來指定bulid出來的binary是要放在哪個目錄底下
C. --enable-interwork
這個選項是for ARM only, 因為ARM處理器有ARM/Thumb mode的分別
並允許程式執行到一半從ARM mode切成Thumb mode, 或反之
因此為了讓binutils可以產生這類mode切換的binary因此需要加這個選項
D. --enable-multilib
打開這個選項可以讓binutils具有產生支援不同設定target的binary
舉例來說, 若CPU同時可以支援big/little endian, 那若沒有這個選項時
binutils在產生target的程式碼時:
big endian的binutils會產生出for big endian的target binary
同理little endian的binutils才能產生little endian binary
由於為了能夠讓big/little endian都能夠使用
因此加了這個選項就可以讓binutils同時支援不同設定的target
留言列表