make前grep "CONFIG_DM9000" -nr .
①Makefile,如obj-$(CONFIG_DM9000) += dm9000.o(在auto.conf中定义)
②config文件,如CONFIG_DM9000=y
③.c文件,如if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
make后增加
④include/config/auto.conf,如CONFIG_DM9000=y(来源.config)
⑤include/linux/autoconf.h,如#define CONFIG_DM9000 1(自动生成,被③利用,来源.config)
显然auto.conf应被最顶层Makefile包含
——————/
Documentation/kbuild/makefiles.txt应看看,讲的较透彻
obj-y += abc.o
abc-objs := a.o b.o c.o
——————/
执行make uImage命令,但顶层Makefile中无uImage目标,但arch/arm/Makefile中有,故肯定被包含
root@lyl:/home/linux-2.6.22.6# vi Makefile include $(srctree)/arch/$(ARCH)/Makefile -include include/config/auto.conf ——————/ uImage: vmlinux vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE //顶层Makefile vmlinux-init := $(head-y) $(init-y) vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y) vmlinux-all := $(vmlinux-init) $(vmlinux-main) vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o //架构相关Makefile |
一步步分析,获得首文件及链接脚本,但该法太繁琐
——————/
root@lyl:/home/linux-2.6.22.6# rm vmlinux
root@lyl:/home/linux-2.6.22.6# make uImage V=1
arm-linux-ld -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o ……
结论:
链接脚本arch/arm/kernel/vmlinux.lds(编译时生成)
首文件arch/arm/kernel/head.o
root@lyl:/home/linux-2.6.22.6# vi arch/arm/kernel/vmlinux.lds SECTIONS { . = (0xc0000000) + 0x00008000; //链接地址 .text.head : { _stext = .; _sinittext = .; *(.text.head) //首先放所有文件的.text.head段,而所有文件的顺序为arm-linux-ld时顺序 } … ——————/ theKernel(0,机器id,参数入口地址) //u-boot //arch/arm/kernel/head.S |