【嵌入式移植】6、U-Boot源码分析3—make

U-Boot源码分析3—make

  • `all`

从【嵌入式移植】4、U-Boot源码分析1—Makefile文章中可知执行make命令的时候,没有指定目标则使用默认目标PHONYPHONY依赖项为_all all scripts_basic outputmakefile scripts dtbs

all

Makefile中第129行指定默认目标PHONY依赖_all,第198行指定_all依赖于all,第859行指明all依赖于$(ALL-y) cfg,而在第768行:
请添加图片描述
最终ALL-y的值为

ALL-y = checkarmreloc u-boot.srec u-boot.bin u-boot.sym System.map binary_size_check spl/u-boot-spl.bin u-boot.img u-boot.dtb u-boot-dtb.img u-boot.itb

ALL-y包含checkarmrelocu-boot.srecu-boot.binu-boot.symSystem.mapbinary_size_checkspl/u-boot-spl.binu-boot.imgu-boot.dtbu-boot-dtb.imgu-boot.itb

这些目标具体是什么用处呢,结合【嵌入式移植】3、编译U-Boot中U-Boot的编译和烧写过程,最终是将编译生成的sunxi-spl.binu-boot.itb烧写到SD卡上

其中u-boot.itbALL-y已经有了,那么sunxi-spl.bin又是怎么来的呢

查看编译过程
请添加图片描述
原来sunxi-spl.bin是使用MKSUNXI这个工具制作的,查看详细的编译过程输出,找到对应的语句(这里可以使用make CROSS_COMPILE=aarch64-linux-gnu- V=1语句输出详细的编译过程,单独保存下来查看)
请添加图片描述
原来sunxi-spl.bin是使用tools目录下的mksunxiboot工具,由spl/u-boot-spl.bi制作而来;而查看顶层Makefilespl/u-boot-spl.bi依赖于spl/u-boot-spl,而spl/u-boot-spl执行的命令为

spl/u-boot-spl: tools prepare \$(if $(CONFIG_OF_SEPARATE)$(CONFIG_SPL_OF_PLATDATA),dts/dt.dtb) \$(if $(CONFIG_OF_SEPARATE)$(CONFIG_TPL_OF_PLATDATA),dts/dt.dtb)$(Q)$(MAKE) obj=spl -f $(srctree)/scripts/Makefile.spl all

前几行为准备编译所需工具,最后一行执行scripts/Makefile.spl,目标为all

进入scripts/Makefile.spl文件,目标all依赖于$(ALL-y),而$(ALL-y)包括$(obj)/$(SPL_BIN).bin$(obj)/sunxi-spl.bin等,其实即需编译生成$(obj)/$(SPL_BIN).bin=spl/u-boot-spl.bin

查看$(obj)/$(SPL_BIN).bin依赖,根据变量定义,在scripts/Makefile.spl第232行~233行:

$(obj)/$(SPL_BIN).bin: $(obj)/$(SPL_BIN)-nodtb.bin FORCE$(call if_changed,copy)

可知spl/u-boot-spl.bin$(obj)/$(SPL_BIN)-nodtb.bin制作(与编译输出匹配cp spl/u-boot-spl-nodtb.bin spl/u-boot-spl.bin

在第303行~304行:

$(obj)/$(SPL_BIN)-nodtb.bin: $(obj)/$(SPL_BIN) FORCE$(call if_changed,objcopy)

可知spl/u-boot-spl-nodtb.bin$(obj)/$(SPL_BIN)通过编译工具aarch-linux-gnu-objcopy制作,对应编译过程输出为:

aarch64-linux-gnu-objcopy -j .text -j .secure_text -j .secure_data -j .rodata -j .data -j .u_boot_list -j .rela.dyn -j .got -j .got.plt -j .dtb.init.rodata -j .efi_runtime -j .efi_runtime_rel  -O binary  spl/u-boot-spl spl/u-boot-spl-nodtb.bin

在第356行~358行:

$(obj)/$(SPL_BIN): $(u-boot-spl-platdata) $(u-boot-spl-init) \$(u-boot-spl-main) $(obj)/u-boot-spl.lds FORCE$(call if_changed,u-boot-spl)

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

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

相关文章

十大免费 Word 转 PDF 转换器工具榜单

将 Word 转换为 PDF 格式可以帮助您在不同操作系统之间轻松共享文件。无论您是发送重要备忘录、为客户开具发票、以一致的格式维护客户记录等等,PDF 都属于最流行且安全的文件格式。当您将 Word 文档转换为 PDF 格式时,您的项目会自动优化且更加紧凑。可…

腾讯云4核8G服务器够用吗?能支持多少人?

腾讯云4核8G服务器支持多少人在线访问?支持25人同时访问。实际上程序效率不同支持人数在线人数不同,公网带宽也是影响4核8G服务器并发数的一大因素,假设公网带宽太小,流量直接卡在入口,4核8G配置的CPU内存也会造成计算…

【数据统计】A股分红率排行榜2023

截至2023年底的,过去一年有分红的,分红率(股息率)排行榜。这里的分红率是股息率,即每股现金分红金额/年底的股价。比如000517荣安地产,2023年的分红方案是每10股3.2元,该股在2023年12月29日的收…

ELAdmin 部署

后端部署 按需修改 application-prod.yml 例如验证码方式、登录状态到期时间等等。 修改完成后打好 Jar 包 执行完成后会生成最终可执行的 jar。JPA版本是 2.6,MyBatis 版本是 1.1。 启动命令 nohup java -jar eladmin-system-2.6.jar --spring.profiles.active…

JDBC教程+数据库连接池

JDBC 1.JDBC概述 ​ JDBC,全称Java数据库连接(Java DataBase Connectivity),它是使用Java语言操作关系型数据库的一套API。 ​ JDBC本质是官方(原SUN公司,现ORACLE)定义的一套操作所有关系型数…

nodejs和npm和vite

Nodejs 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境 用途: Node.js 可以被看作是一个 JavaScript 运行时环境,专门用于在服务…

Python re.findall()和re.finditer()实现在字符串中查找所有匹配项的功能区别

re.findall() re.findall() 函数返回所有非重叠匹配的列表。它只包含匹配的子串,不包含任何关于匹配位置的信息。 import re text "Hello, world! This is a test." pattern r"\w" # 匹配一个或多个单词字符 matches re.findall(patt…

Flutter 网络请求之Dio库

Flutter 网络请求之Dio库 前言正文一、配置项目二、网络请求三、封装① 单例模式② 网络拦截器③ 返回值封装④ 封装请求 四、结合GetX使用五、源码 前言 最近再写Flutter系列文章,在了解过状态管理之后,我们再来学习一下网络请求。 正文 网络请求对于一…

starknet之 class_hash

文章目录 问题背景什么是Class Hash问题背景 部署合约报错:ReferenceError: Buffer is not defined 什么是Class Hash 官方: https://book.starknet.io/ch04-03-01-deploy-standard-account.html?highlight=class%20hash#finding-the-class-hash 要部署智能合约,您需要在…

微软在其Windows系统中暗示了AI的未来,推出了更聪明的Copilot功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

《剑指 Offer》专项突破版 - 面试题 41 和 42 : 详解队列的应用(C++ 实现)

目录 队列的应用 面试题 41 : 滑动窗口的平均值 面试题 42 : 最近请求次数 队列的应用 队列是一种经常被使用的数据结构。如果解决某个问题时数据的插入和删除操作满足 "先进先出" 的特点,那么可以考虑用队列来存储这些数据。 例如,数组中…

shell 脚本停止应用

如果你想使用shell脚本来停止一个正在运行的应用,你通常会依赖于该应用是否已经提供了一个停止的方法,或者你可以使用系统工具来结束它。 以下是一些常见的方法来停止一个应用: 使用应用的内置停止命令: 如果应用提供了一个内置…

批量梯度下降、随机梯度下降、小批量梯度下降

一、批量梯度下降(Batch Gradient Descent,BGD) 在批量梯度下降中,每次迭代都使用整个训练集的数据进行梯度计算和参数更新。也就是说,每次迭代都对所有的样本求取梯度,然后更新参数。由于要处理整个训练集&#xff0c…

gpt记忆功能是什么?openAI迎来重大更新

OpenAI正在对 ChatGPT 引入记忆功能进行测试。这项功能能让 ChatGPT 记住你在所有对话中提及的信息,避免你重复输入相同的信息,从而让未来的交流更加高效。 ChatGPT 的记忆功能完全由你控制。你可以直接告诉它需要记住的内容,查询它记住了哪…

C#入门及进阶|数组和集合(八):HashTable类介绍

在ArrayList集合中,可以使用索引访问元素,如果不能确切知道索引的值,访问就比较困难。HashTable称为哈希表,和ArrayList不同,它利用键/值来存储数据,在哈希表中,每个元素都是一个键/值对&#x…

刷题计划_冲绿名

现在 rating 是 1104 准备刷 100道 1200的题,把实力提升到 1200 ,上一个绿名 每一个分数段的题都写一百道,争取早日上蓝 现在 虽然 cf 里面显示写了一些这个分数段的题,但是自己训练的时候,其实是没有训练一道这个分…

【Py/Java/C++三种语言详解】LeetCode每日一题240214【二叉树BFS】LeetCode102、二叉树的层序遍历

有LeetCode交流群/华为OD考试扣扣交流群可加:948025485 可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1336了解算法冲刺训练 文章目录 题目链接题目描述解题思路DFS和BFS异同用队列维护的BFS 代码PythonJavaC时空复杂度 相关习题华为OD算法/大…

现代浏览器对 es模块 【esm】原生支持

现代浏览器对 ES(ECMAScript)模块的原生支持是指浏览器可以直接解析和执行 JavaScript 文件中的 ES 模块语法,无需额外的工具或转换。 具体来说,当浏览器遇到 import 和 export 关键字时,会将其识别为 ES 模块语法&…

Linux 基础/子目录分配/文件路径

在Linux系统中,整个系统只具有一个根目录“/”,用斜杠表示。根目录是整个文件系统的顶层目录,在他下面可以创建其他的目录和文件。 Linux中的子目录分配: /bin - 基本命令的二进制文件,这些命令可供所有用户使用&am…

MySQL主从环境,主库改端口后,从库如何操作?

主库:mysql-111 从库:mysql-112 主库由3306端口修改成3307后, 从库执行如下命令 mysql> stop slave; mysql> change master to master_port3307; mysql> CHANGE MASTER TO MASTER_HOST192.168.10.111,MASTER_USERbeifen,MASTER_PA…