Tip1:交叉編譯選項
編譯linux,通常只需要運行make menuconfig配置要編譯的模塊,然后運行make。Linux默認是做本地編譯,也就是編譯位本機使用的內核。
在嵌入式開發中,經常需要交叉編譯,要做交叉編譯的話,需要在make命令后加上宏定義,如交叉編譯為arm目標:
make?ARCH=arm?CROSS_COMPILE=arm-linux-
ARCH=arm:表示目標CPU為ARM架構
CROSS_COMPILE=arm-linux-:
表示編譯過程使用的交叉編譯鏈為arm-linux
當然也可以直接修改Makefile中的ARCH和CROSS_COMPILE宏定義,以此實現同樣的效果。但是不建議直接修改Makefile。
Tip2:源碼與目標文件分離
Linux內核編譯過程會產生很多的文件,包括目標文件、臨時文件等等,默認情況下,編譯生成的文件會存放在內核源碼目錄。
當你使用git status顯示自己對內核代碼的修改時也會把這些臨時文件顯示出來,而且提交還必須一個文件一個文件地指定,相當麻煩。
因此我們可以在父目錄創建一個存放編譯文件的目錄,如build-kernel,然后再make 命令后面加上宏定義:
make?O=../build-kernel
這樣在編譯Linux內核時,所有編譯產生的文件,都會放在build-kernel目錄,如果build-kernel目錄不存在,也會自動創建。這樣可以實現Linux內核源碼與編譯產生的文件分離。
Tip3:獲得編譯命令及選項
編譯linux時,默認不會顯示編譯的命令,如果你要獲得編譯命令及其選項,可以在make命令后面加上宏定義:
make?V=1
如果希望編譯系統告訴你為何某個目標文件需要重新編譯,則:
make?V=2
內核編譯腳本
最后分享我常用的內核編譯腳本mk.sh,給大家參考:
#!/bin/sh export?ARCH=arm export?PATH=~/toolchain/arm_glibc/host/bin:$PATH export?CROSS_COMPILE=arm-linux-gnu- #make?O=../bd?defconfig make?O=../bd?menuconfig?-j32 make?O=../bd?dtbs #反匯編 $(CROSS_COMPILE)objdump?-d?../bd/vmlinux?>?../image/vmlinux_dump.txt #生成uImage ../ubd/tools/mkimage?-A?arm?-T?kernel?-C?none?-O?linux?-a?0x80200000?-e?0x80200000?-n?"debug?kernel"?-d?../bd/Image?../image/uImage
其中,make O=../bd defconfig只有在第一次編譯內核的才使用,第一次編譯過后,將這句注釋,后面都通過make menuconfig修改內核配置。
objdump反匯編對大多數人來說可能用不上,一般在內核移植、啟動分析時比較有用,但由于工作需要,我通常都會把反匯編加上。