Linux移植之子目录下的built-in.o生成过程分析

发布者:CelestialLight最新更新时间:2024-08-26 来源: cnblogs关键字:Linux移植 手机看文章 扫描二维码
随时随地手机看文章

在Linux移植之make uImage编译过程分析中罗列出了最后链接生成vmlinux的过程。可以看到在每个子目录下都有一个built-in.o文件。对于此产生了疑问built-in.o文件是根据什么产生的。


arm-linux-ld -EL  -p --no-undefined -X -o vmlinux -T arch/arm/kernel/vmlinux.lds

arch/arm/kernel/head.o arch/arm/kernel/init_task.o  init/built-in.o --start-group  usr/built-in.o  arch/arm/kernel/built-in.o  

arch/arm/mm/built-in.o  arch/arm/common/built-in.o  arch/arm/mach-s3c2410/built-in.o  arch/arm/mach-s3c2400/built-in.o  

arch/arm/mach-s3c2412/built-in.o  arch/arm/mach-s3c2440/built-in.o  arch/arm/mach-s3c2442/built-in.o  arch/arm/mach-s3c2443/built-in.o  

arch/arm/nwfpe/built-in.o  arch/arm/plat-s3c24xx/built-in.o  kernel/built-in.o  mm/built-in.o  fs/built-in.o  ipc/built-in.o  

security/built-in.o  crypto/built-in.o  block/built-in.o  arch/arm/lib/lib.a  lib/lib.a  arch/arm/lib/built-in.o  lib/built-in.o  

drivers/built-in.o  sound/built-in.o  net/built-in.o --end-group .tmp_kallsyms2.o


1、测试,在linux目录下添加一个test文件夹,在文件夹里面添加了test.c 和 Makefile。测试是否也会生成built-in.o文件


2、从顶层Makefile文件开始分析built-in.o原理


3、递归规则


1、测试,在linux目录下添加一个test文件夹,在文件夹里面添加了test.c 和 Makefile。测试是否也会生成built-in.o文件


a、mkdir test,创建test文件夹


b、cd test,进入test文件夹


d、vim Makefile,在里面创建Makefile


#

#Makefile for the linux kernel makefile experiment.

#

obj-y := test.o

e、vim test.c,在里面创建C文件


#include


int test_global = 0;

f、修改顶层Makefile,在core-y后面增加test/目录


-core-y         += kernel/ mm/ fs/ ipc/ security/ crypto/ block/

+core-y         += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ test/

g、make uImage后观察到在链接的过程中多出了test/built-in.o 文件。测试成功


arm-linux-ld -EL  -p --no-undefined -X -o .tmp_vmlinux1 -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_task.o  

init/built-in.o --start-group  usr/built-in.o  arch/arm/kernel/built-in.o  arch/arm/mm/built-in.o  arch/arm/common/built-in.o  

arch/arm/mach-s3c2410/built-in.o  arch/arm/mach-s3c2400/built-in.o  arch/arm/mach-s3c2412/built-in.o  arch/arm/mach-s3c2440/built-in.o  

arch/arm/mach-s3c2442/built-in.o  arch/arm/mach-s3c2443/built-in.o  arch/arm/nwfpe/built-in.o  arch/arm/plat-s3c24xx/built-in.o  

kernel/built-in.o  mm/built-in.o  fs/built-in.o  ipc/built-in.o  security/built-in.o  crypto/built-in.o  block/built-in.o  test/built-in.o  

arch/arm/lib/lib.a  lib/lib.a  arch/arm/lib/built-in.o  lib/built-in.o  drivers/built-in.o  sound/built-in.o  net/built-in.o --end-group 


2、从顶层Makefile文件开始分析built-in.o原理,在测试成功后,要分析是怎么做到更改了几个文件就能产生test/built-in.o并且编译进内核的。


从顶层Makefile开始分析,vmlinux-dirs包含了所有的linux子目录


vmlinux-dirs    := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m)

             $(core-y) $(core-m) $(drivers-y) $(drivers-m)

             $(net-y) $(net-m) $(libs-y) $(libs-m)))


$(patsubst ,, )

名称:模式字符串替换函数——patsubst。

功能:查找中的单词(单词以“空格”、“Tab”或“回车”“ 换行”分隔)是否符合模

,如果匹配的话,则以替换。这里,可以包括通配符“%”,

表示任意长度的字串。如果中也包含“%”,那么,中的这个“%”

将是中的那个“%”所代表的字串。(可以用“”来转义,以“%”来表示真实含

义的“%”字符)

返回:函数返回被替换过后的字符串。


$(filter , )

名称:过滤函数——filter。

功能:以模式过滤字符串中的单词,保留符合模式的单词。可以有

多个模式。

返回:返回符合模式的字串。

另外在arch/arm/Makefile下也定义了一些文件夹:


171    core-y                += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/

172    core-y                += $(MACHINE)

173    core-$(CONFIG_ARCH_S3C2410)    += arch/arm/mach-s3c2400/

174    core-$(CONFIG_ARCH_S3C2410)    += arch/arm/mach-s3c2412/

175    core-$(CONFIG_ARCH_S3C2410)    += arch/arm/mach-s3c2440/

176    core-$(CONFIG_ARCH_S3C2410)    += arch/arm/mach-s3c2442/

177    core-$(CONFIG_ARCH_S3C2410)    += arch/arm/mach-s3c2443/

178    core-$(CONFIG_FPE_NWFPE)    += arch/arm/nwfpe/

179    core-$(CONFIG_FPE_FASTFPE)    += $(FASTFPE_OBJ)

180    core-$(CONFIG_VFP)        += arch/arm/vfp/

181

182    # If we have a common platform directory, then include it in the build.

183    core-$(CONFIG_PLAT_IOP)        += arch/arm/plat-iop/

184    core-$(CONFIG_ARCH_OMAP)    += arch/arm/plat-omap/

185    core-$(CONFIG_PLAT_S3C24XX)        += arch/arm/plat-s3c24xx/

186

187    drivers-$(CONFIG_OPROFILE)      += arch/arm/oprofile/

188    drivers-$(CONFIG_ARCH_CLPS7500)    += drivers/acorn/char/

189    drivers-$(CONFIG_ARCH_L7200)    += drivers/acorn/char/

190

191    libs-y                := arch/arm/lib/ $(libs-y)


展开得到


vmlinux-dir = init usr

arch/arm/kernel arch/arm/mm arch/arm/common arch/arm/mach-s3c2410 arch/arm/mach-s3c2400 arch/arm/mach-s3c2412 arch/arm/mach-s3c2440 

arch/arm/mach-s3c2442 arch/arm/mach-s3c2443 arch/arm/nwfpe arch/arm/plat-s3c24xx   

kernel mm fs ipc security crypto block test 

arch/arm/lib lib arch/arm/lib 

drivers sound net 


继续看顶层Makefile生成vmlinux-dirs的规则如下:


764    $(vmlinux-dirs): prepare scripts

765        $(Q)$(MAKE) $(build)=$@

以创建的test目录为例:展开得到。它的意思是调用scripts/Makefile.build。令参数obj=test,然后make。


make -f scripts/Makefile.build obj=test

接着进入scripts/Makefile.build继续分析,它的默认目标是__build:


07    PHONY := __build

08    __build:


83    __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y))

84         $(if $(KBUILD_MODULES),$(obj-m))

85         $(subdir-ym) $(always)

86        @:


接着看builtin-target、lib-target,它们被定义的条件是obj-%、lib-%不能为空


73    ifneq ($(strip $(lib-y) $(lib-m) $(lib-n) $(lib-)),)

74    lib-target := $(obj)/lib.a

75    endif

76

77    ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(lib-target)),)

78    builtin-target := $(obj)/built-in.o

79    endif


名称:去空格函数——strip。

功能:去掉字串中开头和结尾的空字符。

返回:返回被去掉空格的字符串值。

接着看生成builtin-target的规则,lib-target的规则类似,还是在scripts/Makefile.build里找到如下规则


254    # To build objects in subdirs, we need to descend into the directories

255    $(sort $(subdir-obj-y)): $(subdir-ym) ;

256

257    #

258    # Rule to compile a set of .o files into one .o file

259    #

260    ifdef builtin-target

261    quiet_cmd_link_o_target = LD      $@

262    # If the list of objects to link is empty, just create an empty built-in.o

263    cmd_link_o_target = $(if $(strip $(obj-y)),

264                  $(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^),

265                  rm -f $@; $(AR) rcs $@)

266

267    $(builtin-target): $(obj-y) FORCE

268        $(call if_changed,link_o_target)

269

270    targets += $(builtin-target)

271    endif # builtin-target


调用if_changed函数,进入scripts/Kbuild.include中


167    if_changed = $(if $(strip $(any-prereq) $(arg-check)),                       

168        @set -e;                                                             

169        $(echo-cmd) $(cmd_$(1));                                             

170        echo 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)

可以看到最后调用的是cmd_link_o_target 脚本,回到scripts/Makefile.build中:


257    #

258    # Rule to compile a set of .o files into one .o file

259    #

260    ifdef builtin-target

261    quiet_cmd_link_o_target = LD      $@

262    # If the list of objects to link is empty, just create an empty built-in.o

263    cmd_link_o_target = $(if $(strip $(obj-y)),

264                  $(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^),

265                  rm -f $@; $(AR) rcs $@)


其中obj-y=test.o定义在test目录下的Makefile中,如下在scripts/Makefile.build中include了$(kbuild-dir)/Makefile,即test/Makefile


16    kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))

17    include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile)

将规则展开得到:最终得到了test/built-in.o  


cmd_link_o_target = arm-linux-ld -EL -r -o test/built-in.o test.o arm-linux-ar rcs test/built-in.o  

 


3、递归规则。如果在子目录下还有子目录编译系统会怎么操作呢,下面就讲述递归的规则:


继续看scripts/Makefile.build,它包含了scripts/Makefile.lib


19 include scripts/Makefile.lib

接着看到scripts/Makefile.lib,里面定义了subdir-ym 这个变量表示的是如果obj-y含有文件夹则将文件夹放到subdir-ym中


24    __subdir-y    := $(patsubst %/,%,$(filter %/, $(obj-y)))

25    subdir-y    += $(__subdir-y)

26    __subdir-m    := $(patsubst %/,%,$(filter %/, $(obj-m)))

27    subdir-m    += $(__subdir-m)

28    obj-y        := $(patsubst %/, %/built-in.o, $(obj-y))

29    obj-m        := $(filter-out %/, $(obj-m))

[1] [2]
关键字:Linux移植 引用地址:Linux移植之子目录下的built-in.o生成过程分析

上一篇:Linux移植之内核启动过程引导阶段分析
下一篇:Linux移植之auto.conf、autoconf.h、Mach-types.h的生成过程简析

推荐阅读最新更新时间:2024-11-11 19:34

​5G信号的改进为每个美国固定接入O-RAN网络节省1.93亿美元
5G无线电信号处理的改进可以为每个美国固定无线接入毫米波O-RAN网络节省1.93亿美元的费用 由AccelerComm委托的Mobile Experts研究显示,增强的LDPC IP可以将美国运营商的gNodeB数量要求降低2550个 英国南安普敦,2021年5月20日 - 用IP为5G赋能,提高频谱效率并减少延迟的AccelerComm公司今天宣布委托Mobile Experts编写的一份报告的结果显示,采用先进信道编码解决方案的移动运营商可以节省大量资金。Mobile Experts的分析报告题为 细节决定成败 ,它计算出通过增强信道编码提高频谱效率可以使典型的美国网络所需的gNodeB数量减少2550个,从而节省1
[网络通信]
详析数字I/O和逻辑分析仪常用术语
  本文介绍了数字I/O和逻辑分析仪的常用术语和定义。   1.抖动   抖动是指与事件理想时序的偏差,并通常基于参考信号的过零点进行测量。 抖动通常来自于串扰、同步开关输出和其它定期发生的干扰信号。 由于抖动会随时间变化,抖动的测量和量化既可以是秒级范围内视觉估计,也可以是基于统计的测量,比如基于标准偏差随时间变化的统计测量。      图1.数字信号抖动示例   2.偏移   对于定时(动态)生成,通道间偏移定义为两个数据通道对应边沿之间的时间差。 例如,如果两个数据通道均设置为在特定采样时从低电平转换为高电平,两个通道上升沿之间的时间差就是两个通道之间的通道间偏移。   对于动态采集,通道间偏移定义为每个
[测试测量]
详析数字I/<font color='red'>O</font>和逻辑分析仪常用术语
Linux-2.6.32.2内核在mini2440上的移植(五)---激活RTC驱动
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 【1】在初始化文件中加入RTC 设备结构 Linux-2.6.32.2 内核对24
[单片机]
Linux高级驱动】触摸屏驱动的移植
触摸屏驱动的移植 流程 注意:看框架图 1.添加input.c组件 Device Drivers --- Input device support --- Generic input layer (needed for keyboard, mouse, ...) 2.添加evdev.c组件 Device Drivers --- Input device support --- * Event interface 3.添加s3c2410_ts.c触摸屏驱动 修改driver/input/touchscreen/Kconfig config TOUCHSCREEN_S3C2410 tristate Samsun
[单片机]
ADI公司和Keysight合作加快O-RAN解决方案开发
合作有助于简化行业向开放、虚拟化的无线电网络架构过渡 中国,北京,2021年6月22日 – Analog Devices, Inc. 和Keysight Technologies, Inc. 今日宣布双方合作,以加快Open RAN无线电单元(O-RU)的网络互操作性和合规性测试。 双方将合作构建一个强大的测试平台,以验证新O-RU的互操作性,包括ADI的low-PHY基带、软件定义收发器、电源,以及与Intel© FPGA集成的时钟。将Keysight的Open RAN仿真、信号生成和信号分析能力应用到广泛的用例中,以改善测试过程,降低复杂性和缩短测试时间。 Keysight商用通信部副总裁兼总经理Kail
[测试测量]
ADI公司和Keysight合作加快<font color='red'>O</font>-RAN解决方案开发
tiny4412学习(四)之移植linux-设备树(2)设备树之LED点灯
硬件平台:tiny4412 系统:linux-4.4 文件系统:busybox-1.25 编译器: arm-none-linux-gnueabi-gcc(gcc version 4.8.3 20140320) uboot:友善自带uboot 这一节修改设备树文件,支持LED点灯。 1、设备树文件 led_pin { compatible = tiny4412,led_demo ; pinctrl-names = led_demo ; pinctrl-0 = &led_demo ; tiny4412,int_gpio1 = &gpm4 0 GPIO_ACTIVE_HIGH ; tiny4412,int
[单片机]
tiny4412学习(四)之<font color='red'>移植</font><font color='red'>linux</font>-设备树(2)设备树之LED点灯
Wide I/O、HBM、HMC将成存储器新标准
现行的DDR4及LPDDR4存储器都是以既有的DRAM设计为基础,其中许多技术已沿用长达十余年,而今无论是系统总频宽或中央处理器(CPU)等作业环境都不可同日而语。有鉴于此,发展新的解决方案为眼下业界的共识,Wide I/O、HBM及HMC等三大新存储器标准遂成业界关注重点。 据ExtremeTech网站报导指出,过去近20年来存储器规格已从第一代的SDRAM DIMM发展至DDR4-3200,成长高达48倍。因此,现今业界虽针对是否应进一步以此标准定义DDR5有所争议,更多人却倾向发展新的存储器标准。 Wide I/O的设计旨在为移动系统单晶片(SoC)提供高频宽、低功耗的存储器,主要吸引的是智能型
[手机便携]
AVR单片机i/o(输入/输出)端口详解
通过前面示例的讲解,已基本知道了单片机I/O端口的用法。为了更好、更深入地运用好I/O端口,下面再来详细讨论一下AVR单片机ATMega16的端口结构。 输入/输出端口(I/O端口)是单片机所能依赖进行控制的唯一通道,如果把单片机内核比作人的大脑,那I/O端口就相当于人的五官和四肢,负责着信息的获取和动作的执行,如果没有I/O端口单片机本身就变得毫无意义,因此很有必要来详细了解它们的内部结构。ATMega16的端口为具有可选上拉电阻的双向I/O端口,下面是其中某一位I/O口的内部结构图(来自于Datasheet)。 在上图中,Pxn就是这一位的输入/输出端口,也就是单片机的某个外部引脚。它通过PORTxn寄存器和数据总线(DA
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved