Tip1:交叉编译选项
编译Linux,一般只须要运行makemenuconfig配置要编译的模块,之后运行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内核编译过程会形成好多的文件,包括目标文件、临时文件等等,默认情况下,编译生成的文件会储存在内核源码目录。
当你使用gitstatus显示自己对内核代码的更改时也会把这种临时文件显示下来,并且递交还必须一个文件一个文件地指定,相当麻烦。
因而我们可以在父目录创建一个储存编译文件的目录,如build-kernel,之后再make命令前面加上宏定义:
make O=../build-kernel
这样在编译Linux内核时,所有编译形成的文件,就会置于build-kernel目录,假如build-kernel目录不存在,也会手动创建。这样可以实现Linux内核源码与编译形成的文件分离。
Tip3:获得编译命令及选项
编译linux时linux vi,默认不会显示编译的命令,假如你要获得编译命令及其选项,可以在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
其中,makeO=../bddefconfig只有在第一次编译内核的才使用,第一次编译之后,将这句注释,前面都通过makemenuconfig更改内核配置。
objdump反汇编对大多数人来说可能用不上linux bin文件 汇编,通常在内核移植、启动剖析时比较有用linux bin文件 汇编linux内核,但因为工作须要,我一般还会把反汇编加上。
END