• Linux内核顶层Makefile的make过程说明一


    一.  Linux内核源码的make编译

    使用命令“make xxx_defconfig”配置好 Linux 内核以后就可以使用“make”或者“make all” 命令进行编译。

    二.  Linux内核源码的make过程

    使用命令“ make xxx_defconfig ”配置好 Linux 内核以后就可以使用“ make ”或者“ make all
    命令进行编译。顶层 Makefile 有如下代码:
    1. 125 PHONY := _all
    2. 126 _all:
    3. ......
    4. 192 PHONY += all
    5. 193 ifeq ($(KBUILD_EXTMOD),)
    6. 194 _all: all
    7. 195 else
    8. 196 _all: modules
    9. 197 endif
    10. ......
    11. 608 all: vmlinux

    126 行, _all 是默认目标,如果使用命令“ make ”编译 Linux 的话此目标就会被匹配。
    193 行,如果 KBUILD_EXTMOD 为空的话 194 行的代码成立, 默认目标 _all 依赖 all
    608 行,目标 all 依赖 vmlinux,所以接下来的重点就是 vmlinux

    顶层 Makefile 中有如下代码:
    1. 905 export KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
    2. 906 export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y)
    3. $(net-y)
    4. 907 export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
    5. 908 export LDFLAGS_vmlinux
    6. 909 # used by scripts/pacmage/Makefile
    7. 910 export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinuxalldirs)) arch Documentation include samples scripts tools virt)
    8. 911
    9. 912 vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)
    10. 913
    11. 914 # Final link of vmlinux
    12. 915 cmd_link-vmlinux = $(CONFIG_SHELL) $< $(LD) $(LDFLAGS)
    13. $(LDFLAGS_vmlinux)
    14. 916 quiet_cmd_link-vmlinux = LINK $@
    15. 917
    16. 918 # Include targets which we want to
    17. 919 # execute if the rest of the kernel build went well.
    18. 920 vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) FORCE
    19. 921 ifdef CONFIG_HEADERS_CHECK
    20. 922 $(Q)$(MAKE) -f $(srctree)/Makefile headers_check
    21. 923 endif
    22. 924 ifdef CONFIG_SAMPLES
    23. 925 $(Q)$(MAKE) $(build)=samples
    24. 926 endif
    25. 927 ifdef CONFIG_BUILD_DOCSRC
    26. 928 $(Q)$(MAKE) $(build)=Documentation
    27. 929 endif
    28. 930 ifdef CONFIG_GDB_SCRIPTS
    29. 931 $(Q)ln -fsn `cd $(srctree) && /bin/pwd`/scripts/gdb/vmlinuxgdb.py
    30. 932 endif
    31. 933 +$(call if_changed,link-vmlinux)

    上面的代码可以看出:

    920 行,可以看出目标 vmlinux 依赖 scripts/link-vmlinux.sh、 $(vmlinux-deps)、 FORCE
    第912 行定义了 vmlinux-deps ,值为:
    vmlinux-deps= $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)
    905 行, KBUILD_VMLINUX_INIT= $(head-y) $(init-y)
    906 行, KBUILD_VMLINUX_MAIN = $(core-y) $(libs-y) $(drivers-y) $(net-y)
    907 行, KBUILD_LDS= arch/$(SRCARCH)/kernel/vmlinux.lds ,其中 SRCARCH=arm ,因此, KBUILD_LDS= arch/arm/kernel/vmlinux.lds

    综上所述,vmlinux 的依赖为:scripts/link-vmlinux.sh、$(head-y) 、$(init-y)、$(core-y) 、 $(libs-y) 、$(drivers-y) 、$(net-y)、arch/arm/kernel/vmlinux.lds 和 FORCE。

    933 行的命令用于链接生成 vmlinux

    下一篇重点来看一下 $(head-y) $(init-y) $(core-y) $(libs-y) $(drivers-y) $(net-y) 这六个变量的值。

  • 相关阅读:
    DevEco Studio如何安装中文插件
    磨金石教育摄影技能干货分享|古风人像拍摄要注意哪些问题
    网络安全(黑客技术)—2024自学
    大数据高级开发工程师——Spark学习笔记(10)
    Flink入门系列06-window
    越细粒度的锁越好吗?产生死锁怎么办?
    210. 课程表 II(leetcode210,ArrayList类型的数组创建,拓扑排序)-------------------Java实现
    第7章 验证你的 Micro SaaS 应用程序构想
    基于蜻蜓优化算法的认知无线电网络的服务质量研究附Matlab代码
    深入学习Linux中的“文件系统与日志分析”
  • 原文地址:https://blog.csdn.net/wojiaxiaohuang2014/article/details/133135072