一. 编译的实质
基于头文件和c文件--->产生对象文件(.o)
将所有的对象文件链接起来,产生可执行文件。
内核的编译系统组成
Makefile
分布在内核源代码中的Makefile, 定义内核的编译规则,配合Kconfig使用。
Kconfig
配置文件,给用户提供配置选项的功能,make menuconfig 等命令根据此文件生成配置文件菜单。
配置工具
包括配置命令解释器(解析Kconfig)和内核配置的用户界面程序等。
使用make config、make menuconfig等命令时, 内核顶层目录会生成一个".config"的配置文件, 该配置文件记录了哪些功能会被编译进内核, 哪些功能会被编译成内核模块。
运行make menuconfig时, 配置工具首先分析与体系结构对应的 arch/< arch >/Kconfig 文件, arch/< arch >/Kconfig 文件中除本身包含一些与体系结构相关的配置项和配置菜单以外, 还通过 source 语句引入下一层的 Kconfig 文件。
配置后生成文件:
include/config: auto.conf
include/generated: autoconf.h
二. 相关命令
2.1 清理配置
指定输出目录
#除了保存config文件以及构建外围模块必要的文件,其他的全部清除。
make clean O=build
#清理全部生成的文件+config文件+不同的备份文件
make mrproper O=build
#彻底的清理,等价于clean + mrproper
make distclean O=build
2.2 配置编译选项
指定arch和输出目录
# 默认内核配置
make O=build defconfig
make O=build ARCH=arm xxx_defconfig
# 或者
cp arch/arm/configs/xxx_defconfig /build/.config
# 修改配置(可能需要切换到gcc下)
make menuconfig O=build
2.3 编译内核
指定交叉编译工具,线程数,输出目录
make ARCH=arm CC=arm-oe-linux-gnueabi-gcc LD=arm-oe-linux-gnueabi-ld.bfd -j 4 O=build
#或者
make zImage O=build ARCH=arm CC="${CC}" LD="arm-oe-linux-gnueabi-ld.bfd" -j 4 O=build
2.4 编译内核模块
指定交叉编译工具,线程数,输出目录
make modules ARCH=arm CC=arm-oe-linux-gnueabi-gcc LD=arm-oe-linux-gnueabi-ld.bfd -j 4 O=build
#或者
make modules O=obj ARCH=arm CC="${CC}" LD="arm-oe-linux-gnueabi-ld.bfd" -j 4 O=build