08_Uboot顶层Makefile分析_make过程

news2024/11/24 5:04:50

目录

make 过程


make 过程

配置好 uboot 以后就可以直接make 编译了,因为没有指明目标,所以会使用默认目标,主 Makefile 中的默认目标如下:

 目标_all 又依赖于all,如下所示:

如果KBUILD_EXTMOD为空的话_all 依 赖 于all 。这 里 不 编 译 模 块,所 以KBUILD_EXTMOD肯定为空,_all 的依赖就是all。在主 Makefileall目标规则如下:

802行可以看出,all目标依赖$(ALL-y),而在顶层Makefile中,ALL-y如下:

 从示例代码代码可以看出,ALL-y 包含 u-boot.srecu-boot.binu-boot.sym、System.map、u-boot.cfg binary_size_check 这几个文件。根据 uboot 的配置情况也可能包含其 他的文件,比如:

ALL-$(CONFIG_ONENAND_U_BOOT) += u-boot-onenand.bin 

CONFIG_ONENAND_U_BOOT就是uboot中跟ONENAND配置有关的,如果我们使能ONENAND,那么在.config 配置文件中就会有“CONFIG_ONENAND_U_BOOT=y”这一句。相 当于 CONFIG_ONENAND_U_BOOT 是个变量,这个变量的值为“y”,所以展开以后就是:

 ALL-y += u-boot-onenand.bin

这个就是.config 里面的配置参数的含义,这些参数其实都是变量,后面跟着变量值,会在 顶层 Makefile 或者其他 Makefile 中调用这些变量。

ALL-y 里面有个u-boot.bin,这个就是我们最终需要的uboot二进制可执行文件,所作的所有工作就是为了它。在顶层Makefile中找到u-boot.bin目标对应的规则,如下所示:

825行判断CONFIG_OF_SEPARATE是否等于y如果相等,那条件就成立,在.config中搜索“CONFIG_OF_SEPARAT”,没有找到,说明条件不成立。

832行就是目标u-boot.bin的规则,目标u-boot.bin依赖于u-boot-nodtb.bin,命令为$(call if_changed,copy) ,这里调用了 if_changed ,if_changed是一个函数, 这个函数在scripts/Kbuild.include中有定义,而顶层Makefile中会包含scripts/Kbuild.include 文件,这个前面已经说过了。if_changed 在 Kbuild.include 中的定义如下: 

 第227行为if_changed的描述,根据描述,在一些先决条件比目标新的时候,或者命令行 有改变的时候,if_changed就会执行一些命令。

257行就是函数if_changed,if_changed函数引用的变量比较多,也比较绕,我们只需要知道它可以从u-boot-nodtb.bin生成u-boot.bin就行了。

既然u-boot.bin依赖于u-boot-nodtb.bin,那么肯定要先生成u-boot-nodtb.bin文件,顶层Makefile中相关代码如下:

 目标u-boot-nodtb.bin又依赖于u-boot,顶层Makefileu-boot相关规则如下:

 目标u-boot依赖于u-boot_initu-boot-mainu-boot.ldsu-boot_initu-boot-main是两个变量,在顶层Makefile中有定义,值如下:

$(head-y)CPU架构有关,我们使用的是ARM芯片,所以head-yarch/arm/Makefile中被指定为:

head-y := arch/arm/cpu/$(CPU)/start.o

根据分析,我们知道CPU=armv7,因此head-y展开以后就是:

 head-y := arch/arm/cpu/armv7/start.o

因此: 

u-boot-init= arch/arm/cpu/armv7/start.o 

$(libs-y)在顶层Makefile中被定义为uboot所有子目录下build-in.o的集合,代码如下:

从上面的代码可以看出,libs-y都是uboot各子目录的集合,最后:  

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

这里调用了函数patsubst,将libs-y中的“/”替换为”/built-in.o”,比如“drivers/dma/”就变为了“drivers/dma/built-in.o”,相当于将libs-y改为所有子目录中built-in.o文件的集合。那么u-boot-main就等于所有子目录中built-in.o的集合。

这个规则就相当于将以u-boot.lds为链接脚本,将arch/arm/cpu/armv7/start.o和各个子目录

下的built-in.o链接在一起生成u-boot

u-boot.lds的规则如下:

接下来的重点就是各子目录下的built-in.o是怎么生成的,以 drivers/gpio/built-in.o为例,在drivers/gpio/目录下会有个名为.built-in.o.cmd 的文件,此文件内容如下:

 从命令“cmd_drivers/gpio/built-in.o”可以看出,drivers/gpio/built-in.o这个文件是使用ld命令由文件 drivers/gpio/mxc_gpio.o生成而来的,mxc_gpio.omxc_gpio.c编译生成的.o文件,这个是NXPI.MX系列的GPIO驱动文件。这里用到了ld的“-r”参数,参数含义如下:

-r –relocateable: 产生可重定向的输出,比如,产生一个输出文件它可再次作为‘ld’的输入,这经常被叫做“部分链接”,当我们需要将几个小的.o文件链接成为一个.o文件的时候,需要使用此选项。最终将各个子目录中的built-in.o文件链接在一起就形成了u-boot,使用如下命令编译uboot就可以看到链接的过程:

 编译的时候会有如图所示内容输出:

 将其整理一下,内容如下:

可以看出最终是用arm-linux-gnueabihf-ld.bfd命令将arch/arm/cpu/armv7/start.o和其他众多的 built_in.o链接在一起,形成 u-boot

目标all除了u-boot.bin以外还有其他的依赖,比如 u-boot.srec u-boot.sym System.mapu-boot.cfgbinary_size_check等等,这些依赖的生成方法和u-boot.bin很类似,大家自行查看 一下顶层 Makefile

 

总结一下“make”命令的流程,如图所示:

 

就是“make”命令的执行流程,关于uboot的顶层Makefile就分析到这里,重点是“make xxx_defconfig”和“make”这两个命令的执行流程:

make xxx_defconfig:用于配置uboot,这个命令最主要的目的就是生成.config 文件。

make:用于编译uboot,这个命令的主要工作就是生成二进制的u-boot.bin文件和其他的一 些与 uboot有关的文件,比如u-boot.imx等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二分分类.

2.1 二分分类 在神经网络的计算中,通常先有一个叫做前向暂停(forward pause)或叫做前向传 播(foward propagation)的步骤,接着有一个叫做反向暂停(backward pause) 或叫做反向传播 (backward propagation)的步骤。 一张图片在计算机中是如何表示的&…

4。计算机组成原理(1)数据表示和运算

嵌入式软件开发,非科班专业必须掌握的基本计算机知识 核心知识点:数据表示和运算、存储系统、指令系统、总线系统、中央处理器、输入输出系统 一 进位计数法和不同进制数的相互转换 其他进制(b),转十进制的计算公式 十进制数,转…

Linux系统编程——多线程[上]:线程概念和线程控制

目录 1.再谈页表 2.Linux线程概念 2.1pthread原生库的基本使用 2.2PID和LWP 2.3Linux线程的资源以及优缺点 2.4Linux线程健壮性问题 2.5可重入函数和线程独立栈 3.Linux线程控制 3.1Linux线程终止 3.2Linux线程等待 3.3线程取消 3.4线程分离 使用线程库的注意事项…

【Python入门】Python基础语法

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Python零基础入门系列,本专栏主要内容为Python基础语法、判断、循环语句、函…

净利润同比增长48.9%,中国平安“一览众山小”

中国平安价值迸发的速度,或许超过了所有人的想象。 4月26日晚,中国平安发布2023年一季度业绩报告,许多自媒体用“炸裂”来形容其亮眼的财务数据。财报显示,第一季度,集团实现营收2537.78亿元,同比增长30.8…

农机电招平台~java

摘要 随着农机电招行业的不断发展,农机电招在现实生活中的使用和普及,农机电招行业成为近年内出现的一个新行业,并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算机让复杂的销售操作变简单,变…

LeetCode:383. 赎金信

🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 题解目录 一、🌱[383. 赎金信](https://leetcode.cn/problems/ransom-note/)…

DOM概述

DOM概述 什么是DOM对象树化的DOM模型DOM 节点 如何获取DOM元素如何更改我们的DOM模型常用属性修改控制样式属性 事件事件监听 事件类型鼠标事件键盘事件焦点事件文本框输入事件 事件对象回调函数DOM 节点插入节点插入节点删除节点查找节点父子关系兄弟关系 什么是DOM 当网页被…

SPSS如何进行因子分析和主成分分析之案例实训?

文章目录 0.引言1.因子分析2.主成分分析 0.引言 因科研等多场景需要进行绘图处理,笔者对SPSS进行了学习,本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结,本文对因子分析和主成分分析进行阐述。 1.因子分…

Android:LeakCanary原理的简单理解和使用

LeakCanary原理的简单理解和使用 1、背景2、LeakCanary2.1、LeakCanary 工作原理2.1.1、检测未被 GC 回收的对象2.1.2、转储堆2.1.3、分析堆2.1.4、对泄漏进行分类 2.2、LeakCanary 使用2.2.1、引入依赖2.2.1.1、原理 2.2.2、配置 LeakCanary2.2.3、检测内存泄漏 3、Fragment 和…

Hystrix断路器 (豪猪)-保险丝

一、概述 重点:能让服务的调用方,够快的知道被调方挂了!不至于说让用户在等待。 Hystix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败(雪崩)。 雪崩&am…

自动驾驶行业观察之2023上海车展-----车企发展趋势(2)

自主品牌发展 比亚迪:展示3款新车,均于2023年年内上市 比亚迪在本次展会上推出了3款新车:宋L概念车(王朝系列)、驱逐舰07(海洋系列)、海鸥(海洋系列)。 • 宋L&#x…

FreeRTOS:任务的创建和删除

目录 一、函数xTaskCreate二、函数xTaskCreateStatic三、函数xTaskCreateRestricted四、函数vTaskDelete五、任务创建和删除(动态)代码5.1实验要求5.2程序代码 一、函数xTaskCreate 此函数用来创建一个任务,任务需要RAM来保存与任务有关的状…

Mysql数据库基本操作(增删改查)

目录 一、数据库的基本操作1.1 登录数据库1.2 创建数据库并进入数据库 二、查看数据库结构2.1 查看数据库信息2.2 查看数据库中包含的表及表结构2.3、常用的数据库类型 三、Mysql数据文件3.1 MYD文件3.2 MYI文件3.3 MyISAM存储引擎 四、SQL 语句1、 DDL数据定义语言1.1 删除指定…

〖Python网络爬虫实战㉒〗- 数据存储之数据库详解

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付…

Eureka、Zookeeper、Consul服务注册与发现

一、Eureka服务注册与发现 1.1 概念 Eureka 是 Netflix 公司开源的一个服务注册与发现的组件 。 Eureka 和其他 Netflix 公司的服务组件(例如负载均衡、熔断器、网关等) 一起,被 Spring Cloud 社区整合为Spring-Cloud-Netflix 模块。 Eure…

校招失败后,在小公司熬了 2 年终于进了百度,竭尽全力....

其实两年前校招的时候就往百度投了一次简历,结果很明显凉了,随后这个理想就被暂时放下了,但是这个种子一直埋在心里这两年除了工作以外,也会坚持写博客,也因此结识了很多优秀的小伙伴,从他们身上学到了特别…

【JavaEE】TCP协议的十大原理保姆讲解(Transmission Control Protocol)

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE初阶 上一篇文章讲了UDP协议,那么这篇文章我来讲讲TCP协议,TCP协议相对UDP协议难一些,内容相对更多。 TCP,即Transmission Control Protocol&…

AArch32 AArch64 Registers map详细解析与索引

1、AArch32 Registers AArch32 系统寄存器索引。 例如第一个寄存器ACTLR点击后解析如下: 2、AArch64 Registers AArch64 系统寄存器索引。 3、AArch32 Operations AArch32 系统指令索引。 例如第一个寄存器ACTLR_EL1点击后解析如下: 4、AArch…

springboot+vue考研资讯平台(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的考研资讯平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风歌&a…