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


    一.  Linux内核源码的make编译

    上一篇文章分析了 Linux内核源码的 make后生成的 vmlinux 所依赖的几个目标。依赖目标包括:

    1. scripts/link-vmlinux.sh
    2. $(head-y) 、 $(init-y) 、 $(core-y) 、 $(libs-y) 、 $(drivers-y) 和 $(net-y)

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

    本文续上一篇文章,地址如下:

    Linux内核顶层Makefile的make过程说明一_凌肖战的博客-CSDN博客

    二.  Linux内核源码的make过程

    下面重点分析一下 $(head-y) 、$(init-y)、$(core-y) 、$(libs-y) 、$(drivers-y) $(net-y) 这六个变量的值。

    1.  head-y

    head-y 定义在文件 arch/arm/Makefile 中,内容如下:

    135 head-y := arch/arm/kernel/head$(MMUEXT).o
    当不使能 MMU 的话, MMUEXT=-nommu ,如果使能 MMU 的话为空,因为我们一般都是用到MMU。因此 , head-y 最终的 值为:
    head-y = arch/arm/kernel/head.o

    2.  init-ydrivers-y net-y

    在顶层 Makefile 中有如下代码:

    1. 558 init-y := init/
    2. 559 drivers-y := drivers/ sound/ firmware/
    3. 560 net-y := net/
    4. ......
    5. 896 init-y := $(patsubst %/, %/built-in.o, $(init-y))
    6. 898 drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))
    7. 899 net-y := $(patsubst %/, %/built-in.o, $(net-y))
    以上可知:init-y、libs-y、drivers-y 和 net-y 最终的值为:
    1. init-y = init/built-in.o
    2. drivers-y = drivers/built-in.o sound/built-in.o firmware/built-in.o
    3. net-y = net/built-in.o

    3.  libs-y

    libs-y 基本和 init-y 一样,在顶层 Makefile 中存在如下代码:

    1. 561 libs-y := lib/
    2. ......
    3. 900 libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
    4. 901 libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))
    5. 902 libs-y := $(libs-y1) $(libs-y2)
    上面的顶层 Makefile 代码可以看出, libs-y 应该等于 lib.a built-in.o ,这个只是一部分!
    因为 arch/arm/Makefile 中会向 libs-y 中追加一些值,代码如下:
    286 libs-y := arch/arm/lib/ $(libs-y)

    arch/arm/Makefile libs-y 的值改为了: arch/arm/lib $(libs-y) ,展开以后为:
    libs-y = arch/arm/lib lib/

    结合 顶层Makefilearch/arm/Makefile 两个文件的设置,libs-y 最终应该为:

    libs-y = arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o

    4.  core-y

    core-y init-y 也一样,在顶层 Makefile 中有如下代码:
    1. 532 core-y := usr/
    2. ......
    3. 887 core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/

    但是,在 arch/arm/Makefile 中会对 core-y 进行追加,代码如下:
    1. 269 core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/
    2. 270 core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ)
    3. 271 core-$(CONFIG_VFP) += arch/arm/vfp/
    4. 272 core-$(CONFIG_XEN) += arch/arm/xen/
    5. 273 core-$(CONFIG_KVM_ARM_HOST) += arch/arm/kvm/
    6. 274 core-$(CONFIG_VDSO) += arch/arm/vdso/
    7. 275
    8. 276 # If we have a machine-specific directory, then include it in the
    9. build.
    10. 277 core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
    11. 278 core-y += arch/arm/probes/
    12. 279 core-y += arch/arm/net/
    13. 280 core-y += arch/arm/crypto/
    14. 281 core-y += arch/arm/firmware/
    15. 282 core-y += $(machdirs) $(platdirs)

    269~274 行根据不同的配置向 core-y 追加不同的值,比如使能 VFP 的话,就会在 .config
    中有 CONFIG_VFP=y 这一行,那么 core-y 就会追加 arch/arm/vfp/
    277~282 行就是对 core-y 进行 直接追加的值。

    顶层 Makefile 中有如下一行:

    897 core-y := $(patsubst %/, %/built-in.o, $(core-y))

    经过上述代码的转换,最终 core-y 的值为:

    1. core-y = usr/built-in.o arch/arm/vfp/built-in.o \
    2. arch/arm/vdso/built-in.o arch/arm/kernel/built-in.o \
    3. arch/arm/mm/built-in.o arch/arm/common/built-in.o \
    4. arch/arm/probes/built-in.o arch/arm/net/built-in.o \
    5. arch/arm/crypto/built-in.o arch/arm/firmware/built-in.o \
    6. arch/arm/mach-imx/built-in.o kernel/built-in.o\
    7. mm/built-in.o fs/built-in.o \
    8. ipc/built-in.o security/built-in.o \
    9. crypto/built-in.o block/built-in.o

    关于 head-y init-ycore-y libs-y drivers-y net-y 6 个变量就讲解到这里。

  • 相关阅读:
    【mmsegmentation】
    概率论与数理统计——事件间的关系
    java计算机毕业设计web企业人事管理信息系统源码+mysql数据库+系统+lw文档+部署
    CCC数字钥匙设计【NFC】 --车主配对流程Phase2
    Java8中判断一个对象不为空存在一个类对象是哪个
    动手学TCP——CS144实验感想
    KNN最近邻算法分析及实现(Python实现)
    JS-JSON
    WEB各类常用测试工具
    C语言 数组作为函数参数
  • 原文地址:https://blog.csdn.net/wojiaxiaohuang2014/article/details/133141736