.o文件 linux生成,vmlinux.o 生成
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 生成相关推荐
- linux生成日志文件,linux实现按天生成日志文件并自动清理
linux实现按天生成日志文件并自动清理 前篇文章中讲到如何在Linux crontab创建每秒执行的方法,高人可能早意识到日志文件没做处理,假如没人工处理久了日后越来越大肯定会出现问题,当然人工处理 ...
- linux 生成dll文件,Linux和Windows平台 动态库.so和.dll文件的生成
Linux动态库的生成 1. 纯cpp文件打包动态库 将所有cpp文件和所需要的头文件放在同一文件夹,然后执行下面命令 gcc -shared - fpic *.c -o xxx.so: g++ -s ...
- linux dd 截文件,Linux使用dd命令快速生成大文件(转)
dd命令可以轻易实现创建指定大小的文件,如 dd if=/dev/zero of=test bs=1M count=1000 会生成一个1000M的test文件,文件内容为全0(因从/dev/zero ...
- linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)
linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...
- linux日志自动按天保存,linux实现按天生成日志文件并自动清理
linux实现按天生成日志文件并自动清理 前篇文章中讲到如何在Linux crontab创建每秒执行的方法,高人可能早意识到日志文件没做处理,假如没人工处理久了日后越来越大肯定会出现问题,当然人工处理 ...
- linux清除configure文件_在Linux操作系统下自动生成Makefile的方法
在Linux操作系统下进行开发,编写Makefile似乎是不可缺少的事情.但是对于一个比较大的工程,编写一个符合规范的Makefile并非易事.而且由于Makefile的各种显式,隐式规则,加之平时并 ...
- linux系统中自动生成snap文件_在Linux操作系统下自动生成Makefile的方法
在Linux操作系统下进行开发,编写Makefile似乎是不可缺少的事情.但是对于一个比较大的工程,编写一个符合规范的Makefile并非易事.而且由于Makefile的各种显式,隐式规则,加之平时并 ...
- Linux dd命令截取文件,linux使用dd命令快速生成大文件
dd命令可以轻易实现创建指定大小的文件,如 dd if=/dev/zero of=test bs=1M count=1000 会生成一个1000M的test文件,文件内容为全0(因从/dev/zero ...
- crt证书linux使用,linux下使用openssl生成https的crt和key证书
x509证书一般会用到三类文,key,csr,crt Key 是私用密钥openssl格,通常是rsa算法. Csr 是证书请求文件,用于申请证书.在制作csr文件的时,必须使用自己的私钥来签署申,还 ...
最新文章
- R语言数据结构之因子
- Access denied for user 'root'@'localhost' (using password: YES)的解决
- reactjs高阶函数和函数柯里化
- 12864液晶驱动源码,独创中英文混合输出
- HDU1251 统计难题 【trie树】
- Pandas使用DataFrame进行数据分析比赛进阶之路(一)
- 启动Spark出现Operation category READ is not supported in state standby
- iOS 5与iOS 6的 low-memory 处理
- 基于 vue+JsPlumb 实现大数据流水线拓展流程工作台(vue-flow-topology)
- Android 性能优化:使用 Lint 优化代码、去除多余资源
- 2022年新一代最强开源UI自动化测试神器 ——Playwright(三)
- 谷歌团队在平安金融中心_Google银行业务可以教给我们关于金融和科技的未来
- 计算机无法超过人类智慧,计算机的智力会超过人类吗?
- 通俗易懂告诉你CPU/GPU/TPU/NPU...都是什么意思?
- 程序员眼中看到的网页是如何制作出来的?
- java 高德地图路线规划_高德地图api之路线规划
- 用计算机归零,windows自带的计算器清零快捷键是哪个?
- flutter bloc 实例
- Oracle日常性能查看
- 有没有哪个趋势指标,更好使?