Compile Linux, usually you only need to run make menuconfig
Configure the modules to be compiled and run make
. Linux defaults to local compilation, which means compiling the kernel used by the local machine.
In embedded development, cross compilation is often required. To do cross compilation, you need to add macro definitions after the make
command. For example, cross compile to arm target:
make ARCH=arm CROSS_COMPILE=arm-linux-
ARCH=arm
: Indicates that the target CPU is an ARM architecture
CROSS_COMPILE=arm-linux-
:
indicates the cross used in the compilation process The compilation chain is arm-linux
. Of course, you can also directly modify the ARCH
and CROSS_COMPILE
macro definitions in Makefile
. This achieves the same effect. But it is not recommended to modify the Makefile directly.
Linux内核编译过程会产生很多的文件,包括目标文件、临时文件等等,默认情况下,编译生成的文件会存放在内核源码目录。
当你使用git status
显示自己对内核代码的修改时也会把这些临时文件显示出来,而且提交还必须一个文件一个文件地指定,相当麻烦。
因此我们可以在父目录创建一个存放编译文件的目录,如build-kernel
,然后再make
命令后面加上宏定义:
make O=../build-kernel
这样在编译Linux内核时,所有编译产生的文件,都会放在build-kernel目录,如果build-kernel目录不存在,也会自动创建。这样可以实现Linux内核源码与编译产生的文件分离。
编译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
反汇编对大多数人来说可能用不上,一般在内核移植、启动分析时比较有用,但由于工作需要,我通常都会把反汇编加上。
The above is the detailed content of A few tips you must know when compiling the Linux kernel. For more information, please follow other related articles on the PHP Chinese website!