1.在内核源码顶层目录下打开Makefile,搜索vmlinux,找到以下内容:
可知主要靠$(vmlinux-deps)生成。
继续搜索查看变量vmlinux-deps的值,找到:
KBUILD_LDS为链接文件,剩下两个变量如下:
搜索head-y未找到,猜测包含了其他路径的Makefile,找到include arch/$(SRCARCH)/Makefile,通过打印信息得知SRCARCH=arm,打开得到:
所以vmlinux通过链接脚本文件将所需的.o文件生成vmlinux可执行文件
2.打开内核源码顶层目录下的Makefile文件,搜索uImage未找到,打开内核源码目录下arch/arm/Makefile,通过以下信息得知:将arch/arm/boot/Makefile和当前Makefile.build文件合并
打开内核源码arch/arm/boot/Makefile文件,搜索uImage,找的目标文件
进入内核源码scripts/Makefile.lib,搜索cmd_uimage,
cmd_uimage=/usr/bin/mkimage -A arm -O linux -C gzip -T kerner -n uImage -d zImage
可知uImage是zImage使用mkimage工具得到的,uImage在zImage添加64字节头部信息
进入内核源码arch/arm/boot/,打开Makefile文件,搜索zImage
arm-linux-gnueabihf-objcopy $(obj)/compressed/vmlinux zImage
zImage是通过vmlinux格式化转换为的文件
进入内核源码arch/arm/boot/,打开Makefile文件,搜索vmlinux
进入内核源码arch/arm/boot/compressed,打开Makefile文件,搜索vmlinux
进入内核源码scripts/Makefile.lib目录下,搜索cmd_gzip cmd_gzip = $(KGZIP) -n -f -9 > $@ = gzip Image > vmlinx
将Image镜像文件经过gzip压缩生成rch/arm/boot/compressed/vmlinx镜像文件
进入内核源码arch/arm/boot/compressed,打开Makefile文件,搜索Image
vmlinux通过objcopy格式化转换为Image
结论:vmlinx--->objcopy--->Image--->gzip--->arch/arm/boot/compressed/vmlinx--->objcopy--->zImage--->mkimage--->uImage