vmlinux.o Makefile 对应内核版本:2.6.35.13

vmlinux.o 是生成 vmlinux 的依赖之一,在链接出 vmlinux 之前会先链接出 vmlinux.o 。

vmlinux.o 定义在顶层 Makefile 中:

vmlinux.o: $(modpost-init) $(vmlinux-main) FORCE

$(call if_changed_rule,vmlinux-modpost)

上面 $(modpost-init) 定义在顶层 Makefile 中:

modpost-init := $(filter-out init/built-in.o, $(vmlinux-init))

它只是从

$(vmlinux-init)中去掉 init/built-in.o 文件。比如在默认的配置下,$(vmlinux-init) 指代的生成文件为:

arch/x86/kernel/head_32.o arch/x86/kernel/head32.o arch/x86/kernel/head.o arch/x86/kernel/init_task.o init/built-in.o

则 $(modpost-init) 就是:

arch/x86/kernel/head_32.o arch/x86/kernel/head32.o arch/x86/kernel/head.o arch/x86/kernel/init_task.o

在 vmlinux.o 底下的 if_changed_rule 函数和

if_changed 函数类似,它会使构建系统调用 rule_vmlinux-modpost --- 该变量也定义在顶层 Makefile 中:

define rule_vmlinux-modpost

:

+$(call cmd,vmlinux-modpost)

$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@

$(Q)echo 'cmd_$@ := $(cmd_vmlinux-modpost)' > $(dot-target).cmd

endef

一开始就使用 $(call cmd,vmlinux-modpost) 即为 cmd_vmlinux-modpost ,它也定义在顶层 Makefile 中:

cmd_vmlinux-modpost = $(LD) $(LDFLAGS) -r -o $@                          \

$(vmlinux-init) --start-group $(vmlinux-main) --end-group             \

$(filter-out $(vmlinux-init) $(vmlinux-main) FORCE ,$^)

上面 $(LD) 即为 ld 链接命令。

$(LDFLAGS) 指代 -m elf_i386 (编译内核在 x86 平台,如果是交叉编译,则 -m 选项后会有相应更改)。

ld 的 --start-group 和 --end-group 之间放置目标文件列表,ld 会对列表中列出的目标文件进行重复的搜索,目的是查看各个文件之间再也没有未决的互相引用,当然这么做是相当耗时的,除非是非做不可。自然的,对于内核而言,这非做不可。

接着

$(filter-out $(vmlinux-init) $(vmlinux-main) FORCE ,$^) 是从所有的依赖中去掉伪目标 FORCE,$(vmlinux-init) 和 $(vmlinux-main) 这几个依赖后看看还有什么别的依赖。默认配置情况下没有,所以这里为空。

在链接出 vmlinux.o 目标后,接着使用 scripts/Makefile.modpost 这个文件来处理 vmlinux.o 目标。跟到  scripts/Makefile.modpost 中看到:

vmlinux.o: FORCE

$(call cmd,kernel-mod)

所以执行的是 cmd_kernel-mod 中的语句,这些语句也在 scripts/Makefile.modpost 中:

quiet_cmd_kernel-mod = MODPOST $@

cmd_kernel-mod = $(modpost) $@

其中  $(modpost) 的定义为:

# Step 2), invoke modpost

#  Includes step 3,4

modpost = scripts/mod/modpost                    \

$(if $(CONFIG_MODVERSIONS),-m)                  \

$(if $(CONFIG_MODULE_SRCVERSION_ALL),-a,)       \

$(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile)   \

$(if $(KBUILD_EXTMOD),-I $(modulesymfile))      \

$(if $(KBUILD_EXTRA_SYMBOLS), $(patsubst %, -e %,$(KBUILD_EXTRA_SYMBOLS))) \

$(if $(KBUILD_EXTMOD),-o $(modulesymfile))      \

$(if $(CONFIG_DEBUG_SECTION_MISMATCH),,-S)      \

$(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w) \

$(if $(cross_build),-c)

由上可见,这里实际使用的是  scripts/mod/ 目录下的 modpost 用来解析 vmlinux.o 对象文件,它检查目标中的 sections 是否 mis match,然后还将基本内核导出的所有符号都记录到文件 Module.symvers 中去。详情可以看 Makefile.modpost 中的注释以及参考 scripts/mod/modpost.c 中的代码。

在上面的诸多判断中,在默认的内核配置下,CONFIG_MODVERSION,CONFIG_MODULE_SRCVERSION,KBUILD_EXTMOD,KBUILD_EXTRA_SYMBOLS,CONFIG_DEBUG_SECTION_MISMATCH 以及 KBUILD_MODPOST_WARN 这些变量都为空,所以最后综合起来得到的命令为:

scripts/mod/modpost -o /home/beyes/Downloads/linux-2.6.35.13/Module.symvers -S vmlinux.o

上面调用 modpost 处理完后,再返回到主 Makefile 中,使用

$(Q)echo 'cmd_$@ := $(cmd_vmlinux-modpost)' > $(dot-target).cmd 将编译 vmlinux.o 的命令写入到.vmlinux.o.cmd 文件中保存起来,以便下次再编译内核时可以进行新旧命令的比较。

.o文件 linux生成,vmlinux.o 生成相关推荐

  1. linux生成日志文件,linux实现按天生成日志文件并自动清理

    linux实现按天生成日志文件并自动清理 前篇文章中讲到如何在Linux crontab创建每秒执行的方法,高人可能早意识到日志文件没做处理,假如没人工处理久了日后越来越大肯定会出现问题,当然人工处理 ...

  2. linux 生成dll文件,Linux和Windows平台 动态库.so和.dll文件的生成

    Linux动态库的生成 1. 纯cpp文件打包动态库 将所有cpp文件和所需要的头文件放在同一文件夹,然后执行下面命令 gcc -shared - fpic *.c -o xxx.so: g++ -s ...

  3. linux dd 截文件,Linux使用dd命令快速生成大文件(转)

    dd命令可以轻易实现创建指定大小的文件,如 dd if=/dev/zero of=test bs=1M count=1000 会生成一个1000M的test文件,文件内容为全0(因从/dev/zero ...

  4. linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  5. linux日志自动按天保存,linux实现按天生成日志文件并自动清理

    linux实现按天生成日志文件并自动清理 前篇文章中讲到如何在Linux crontab创建每秒执行的方法,高人可能早意识到日志文件没做处理,假如没人工处理久了日后越来越大肯定会出现问题,当然人工处理 ...

  6. linux清除configure文件_在Linux操作系统下自动生成Makefile的方法

    在Linux操作系统下进行开发,编写Makefile似乎是不可缺少的事情.但是对于一个比较大的工程,编写一个符合规范的Makefile并非易事.而且由于Makefile的各种显式,隐式规则,加之平时并 ...

  7. linux系统中自动生成snap文件_在Linux操作系统下自动生成Makefile的方法

    在Linux操作系统下进行开发,编写Makefile似乎是不可缺少的事情.但是对于一个比较大的工程,编写一个符合规范的Makefile并非易事.而且由于Makefile的各种显式,隐式规则,加之平时并 ...

  8. Linux dd命令截取文件,linux使用dd命令快速生成大文件

    dd命令可以轻易实现创建指定大小的文件,如 dd if=/dev/zero of=test bs=1M count=1000 会生成一个1000M的test文件,文件内容为全0(因从/dev/zero ...

  9. crt证书linux使用,linux下使用openssl生成https的crt和key证书

    x509证书一般会用到三类文,key,csr,crt Key 是私用密钥openssl格,通常是rsa算法. Csr 是证书请求文件,用于申请证书.在制作csr文件的时,必须使用自己的私钥来签署申,还 ...

最新文章

  1. R语言数据结构之因子
  2. Access denied for user 'root'@'localhost' (using password: YES)的解决
  3. reactjs高阶函数和函数柯里化
  4. 12864液晶驱动源码,独创中英文混合输出
  5. HDU1251 统计难题 【trie树】
  6. Pandas使用DataFrame进行数据分析比赛进阶之路(一)
  7. 启动Spark出现Operation category READ is not supported in state standby
  8. iOS 5与iOS 6的 low-memory 处理
  9. 基于 vue+JsPlumb 实现大数据流水线拓展流程工作台(vue-flow-topology)
  10. Android 性能优化:使用 Lint 优化代码、去除多余资源
  11. 2022年新一代最强开源UI自动化测试神器 ——Playwright(三)
  12. 谷歌团队在平安金融中心_Google银行业务可以教给我们关于金融和科技的未来
  13. 计算机无法超过人类智慧,计算机的智力会超过人类吗?
  14. 通俗易懂告诉你CPU/GPU/TPU/NPU...都是什么意思?
  15. 程序员眼中看到的网页是如何制作出来的?
  16. java 高德地图路线规划_高德地图api之路线规划
  17. 用计算机归零,windows自带的计算器清零快捷键是哪个?
  18. flutter bloc 实例
  19. Oracle日常性能查看
  20. 有没有哪个趋势指标,更好使?

热门文章

  1. ubuntu find 文件时权限不够
  2. Unity 5.6 UGUI 按钮被遮挡
  3. canvas beginPath()的初步理解
  4. DotNetBar的初步使用
  5. 3.6 SQL Server 内存
  6. Qt 5.9.1 连 MYSQL 5.7数据库
  7. linux里用cmake安装的软件要怎么卸载?
  8. 马化腾亲身分享:腾讯兵法教你做一款高口碑的产品
  9. 每日一小练——高速Fibonacci数算法
  10. Android源码学习之浅析SystemServer脉络