内核中单个.o文件的编译过程

本文详细探讨了Linux内核中单个.o文件的编译过程,从根目录的Makefile开始,揭示了build-dir、target-dir、Makefile.build和Kbuild.include等关键步骤。通过跟踪make命令,解析了if_changed_rule和cmd_cc_o_c等函数,最终理解了内核如何编译.c文件为.o目标文件。
摘要由CSDN通过智能技术生成

逐步地我们已经对kbuild有了一定的了解,知道了kbuild还会有自己定义的函数,以及这些函数会在一个类似c语言的头文件中定义。做了这么多准备,该是时候探索真正的代码编译了。先来看看一个.o文件是如何编译的。

比如我们拿这个文件来做例子:

make mm/memblock.o

找到我们的目标

有了刚才的经验,这次我们顺着之前的思路。先到根目录的Makefile中找找线索。有时候找代码除了经验,还得有点运气。不知道你这次有没有找到呢?

单个文件的目标还是在根目录Makefile文件中。

%.o: %.c prepare scripts FORCE
    $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)

你看,这格式其实和我们平时自己写的规则是差不多的。.o的文件依赖于同名的.c文件,然后执行了一个命令来生成。不过呢,确实还多了些东西,包括一些特殊的依赖条件,以及这个命令长得也有点丑。

俗话说的好,恶人自有恶人磨,长得丑的代码也有丑办法来解读。

把上面这段代码添加一个井号

%.o: %.c prepare scripts FORCE
    #$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)

再运行一次

$ make mm/memblock.o
  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  CHK     include/generated/timeconst.h
  CHK     include/generated/bounds.h
  CHK     include/generated/asm-offsets.h
  CALL    scripts/checksyscalls.sh
# @make -f ./scripts/Makefile.build obj=mm mm/memblock.o

怎么样,通过显示实际执行的命令,是不是你感觉熟悉了些?从显示出的命令来看,生成mm/memblock.o这个目标文件是重新又调用了一次make,而这次使用的是script/Makefile.build这个规则文件,传入的参数是obj=mm,目标还是mm/memblock.o。

你看,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值