編譯Linux kernel時設定交叉編譯器
在預設情況下,核心構建系統預設核心是本地編譯,即編譯的核心是執行在與宿主系統相同的體系架構上。如果是為其他的架構編譯核心,即交叉編譯,我們需要設定兩個變數:ARCH和CROSS_COMPILE。其中:
ARCH指明目標體系架構,即編譯好的核心執行在什麼平臺上,如x86、arm或mips等。
CROSS_COMPILE指定使用的交叉編譯器的字首。對於我們的交叉工具鏈來說,其字首是i686-none-linux-gnu-。
在頂層的Makefile中,我們可以看到工具鏈中的編譯器、連結器等均以$(CROSS_COMPILE)作為字首:
linux-3.7.4/Makefile:
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
可以使用多種方式定義這兩個變數,比如通過在環境變數中定義ARCH、CROSS_COMPILE;或者每次執行make時,通過命名行為這兩個變數的賦值,如:
make ARCH=i386 CROSS_COMPILE=i686-none-linux-gnu-
也可以直接更改頂層Makefile。這種方法比較方便,但是要小心,以免破壞Makefile檔案。本書中我們採用這種方式,將頂層Makefile中的如下指令碼:
linux-3.7.4/Makefile:
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
更改為:
linux-3.7.4/Makefile:
ARCH ?= i386
CROSS_COMPILE ?= i686-none-linux-gnu-