本文共 2718 字,大约阅读时间需要 9 分钟。
c码编译流程
$(vmlinux-dirs): prepare scripts $(Q)$(MAKE) $(build)=$@ || \/vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \ $(core-y) $(core-m) $(drivers-y) $(drivers-m) \ $(net-y) $(net-m) $(libs-y) $(libs-m))) || \/vmlinux-dirs := init kernel mm fs ipc security crypto block drivers sound firmware net lib || \/ build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj || \/ make -f scripts/Makefile.build obj=init kernel mm fs ipc security crypto block drivers sound firmware net lib || \/ 没有目标,走默认的目标,也就是第一个目标__build __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \ $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \ $(subdir-ym) $(always) @: || \/ builtin-target := $(obj)/built-in.o lib-target := $(obj)/lib.a extra-y := head_$(BITS).o head$(BITS).o head.o init_task.o vmlinux.lds || \/ __build: $(obj)/built-in.o $(obj)/lib.a head_$(BITS).o head$(BITS).o head.o init_task.o vmlinux.lds || \/ $(builtin-target): $(obj-y) FORCE $(call if_changed,link_o_target) || \/ obj-y包含在具体obj目录的Makefile src := $(obj) kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) include $(kbuild-file) || \/ 以fs为例 obj-y := open.o read_write.o file_table.o super.o \ char_dev.o stat.o exec.o pipe.o namei.o fcntl.o \ ioctl.o readdir.o select.o fifo.o dcache.o inode.o \ attr.o bad_inode.o file.o filesystems.o namespace.o \ seq_file.o xattr.o libfs.o fs-writeback.o \ pnode.o drop_caches.o splice.o sync.o utimes.o \ stack.o fs_struct.o obj-$(CONFIG_SQUASHFS) += squashfs/ || \/ $(obj)/%.o: $(src)/%.c FORCE $(call cmd,force_checksrc) $(call if_changed_rule,cc_o_c) || \/ 如果遇到obj-y +=目录的情况, 则进入子目录继续编译。可以做实验证明:如果注释掉obj-$(CONFIG_SQUASHFS) += squashfs/,则squashfs目录则不会被编译
汇编S编译流程
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE || \/ vmlinux-lds := arch/$(SRCARCH)/kernel/vmlinux.lds || \/ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ; || \/ 跟c语言类似的流程 ... ... || \/ $(obj)/%.lds: $(src)/%.lds.S FORCE $(call if_changed_dep,cpp_lds_S)
内核中单个.o文件的编译过程
https://blog.csdn.net/RichardYSteven/article/details/56666514Linux内核构建系统之五
https://blog.csdn.net/lixiangminghate/article/details/50494535内核映像的形成——递归编译各对象
https://blog.csdn.net/yunsongice/article/details/6106036