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/56666514
Linux内核构建系统之五
https://blog.csdn.net/lixiangminghate/article/details/50494535
内核映像的形成——递归编译各对象
https://blog.csdn.net/yunsongice/article/details/6106036
本文详细解析了Linux内核的编译流程,包括c码和S码的编译过程,以及如何通过递归编译各对象来形成最终的内核映像。深入探讨了从Makefile到具体源文件的编译规则。

6733

被折叠的 条评论
为什么被折叠?



