uboot顶层Makefile分析-make的过程分析一

这篇具有很好参考价值的文章主要介绍了uboot顶层Makefile分析-make的过程分析一。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.  uboot的 make过程

本文来了解一下,uboot的 make 过程。继uboot配置命令执行之后,最终生成 uboot.bin 裸机程序的过程。

之前有了解 uboot的配置过程,即执行 "make xxx_deconfig"命令,主要生成 .config配置文件的过程。不同类型的开发板(即EMMC / Nand-Flash)所用的配置文件不同。

二.  顶层 Makefile -make过程

1. 依赖关系

配置好 uboot 以后就可以直接 make 编译了,因为没有指明目标,所以会使用默认目标。

顶层 Makefile 中的默认目标如下:

128 # That's our default target when none is given on the command line
129 PHONY := _all
130 _all:

(1)  目标_all 依赖规则

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

196 PHONY += all
197 ifeq ($(KBUILD_EXTMOD),)
198 _all: all
199 else
200 _all: modules
201 endif

可以看出,这 里 不 编 译 模 块 , 所 以 KBUILD_EXTMOD 为空,_all 的依赖就是 all

(2)  all 依赖规则

在主 Makefile all依赖于 ALL_y 规则如下:
802 all: $(ALL-y)

(3)  ALL_y 依赖规则

而在顶层 Makefile 中, ALL-y 依赖规则 如下:
731 ALL-y += u-boot.srec u-boot.bin u-boot.sym System.map u-boot.cfg 
binary_size_check
732
733 ALL-$(CONFIG_ONENAND_U_BOOT) += u-boot-onenand.bin
734 ifeq ($(CONFIG_SPL_FSL_PBL),y)
735 ALL-$(CONFIG_RAMBOOT_PBL) += u-boot-with-spl-pbl.bin
736 else
737 ifneq ($(CONFIG_SECURE_BOOT), y)
738 # For Secure Boot The Image needs to be signed and Header must also
739 # be included. So The image has to be built explicitly
740 ALL-$(CONFIG_RAMBOOT_PBL) += u-boot.pbl
741 endif

可以看出,ALL-y 包含 u-boot.srecu-boot.binu-boot.symSystem.mapu-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 中调用这些变量。

(4) uboot.bin 依赖关系

  u-boot.bin,最终是我们需要的 uboot 二进制可执行文件, 所作的所 有工作就是为了它。在顶层 Makefile 中找到 u-boot.bin 目标对应的规则,如下所示:
825 ifeq ($(CONFIG_OF_SEPARATE),y)
826 u-boot-dtb.bin: u-boot-nodtb.bin dts/dt.dtb FORCE
827 $(call if_changed,cat)
828
829 u-boot.bin: u-boot-dtb.bin FORCE
830 $(call if_changed,copy)
831 else
832 u-boot.bin: u-boot-nodtb.bin FORCE
833 $(call if_changed,copy)
834 endif
825 行判断 CONFIG_OF_SEPARATE 是否等于 y ,如果相等,那条件就成立,在 .config
中搜索“ CONFIG_OF_SEPARAT ”,没有找到,说明条件不成立。
832 行就是目标 u-boot.bin 的规则,目标 u-boot.bin 依赖于 u-boot-nodtb.bin。

(5) u-boot-nodtb.bin 依赖关系

目标 u-boot-nodtb.bin 又依赖于 u-boot ,顶层 Makefile u-boot 相关规则如下:
1170 u-boot: $(u-boot-init) $(u-boot-main) u-boot.lds FORCE
1171 $(call if_changed,u-boot__)
1172 ifeq ($(CONFIG_KALLSYMS),y)
1173 $(call cmd,smap)
1174 $(call cmd,u-boot__) common/system_map.o
1175 endif

(6)  u-boot 依赖规则

目标 u-boot 依赖于 u-boot_init u-boot-main u-boot.lds u-boot_init u-boot-main 是两个
变量,在顶层 Makefile 中有定义,规则如下:
678 u-boot-init := $(head-y)
679 u-boot-main := $(libs-y)

(7)  $(head-y) 依赖关系与 $(libs-y) 的依赖关系

$(head-y) CPU 架构有关,我们使用的是 ARM 芯片,所以 head-y arch/arm/Makefile
被指定为:
head-y := arch/arm/cpu/$(CPU)/start.o
我们知道 CPU=armv7 ,因此, head-y 展开以后就是:
head-y := arch/arm/cpu/armv7/start.o
$(libs-y) 在顶层 Makefile 中被定义为 uboot 所有子目录下 build-in.o 的集合,(这里只显示了涉及 $(libs-y) 一部分代码), 代码如下:
620 libs-y += lib/
621 libs-$(HAVE_VENDOR_COMMON_LIB) += board/$(VENDOR)/common/
622 libs-$(CONFIG_OF_EMBED) += dts/
623 libs-y += fs/
624 libs-y += net/
625 libs-y += disk/
626 libs-y += drivers/
627 libs-y += drivers/dma/
628 libs-y += drivers/gpio/
629 libs-y += drivers/i2c/
......
660 libs-y += cmd/
661 libs-y += common/
可以看出, 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.lds 为链接脚本,将 arch/arm/cpu/armv7/start.o 和各个子目录
下的 built-in.o 链接在一起生成 u-boot
链接脚本 u-boot.lds 的规则如下:
u-boot.lds: $(LDSCRIPT) prepare FORCE
    $(call if_changed_dep,cpp_lds)

链接脚本 u-boot.lds文件,默认是没有的,编译后才会生成。uboot根目录下的链接脚本文件 u-boot.ld 是由其他文件生成的,通过工程搜索,应该是由 arch\arm\cpu\u-boot.lds生成的。

下一篇文章继续了解 uboot的 make过程。文章来源地址https://www.toymoban.com/news/detail-709317.html

到了这里,关于uboot顶层Makefile分析-make的过程分析一的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uboot顶层Makefile前期所做工作说明四

    uboot 顶层 Makefile ,就是 uboot源码工程的根目录下的  Makefile文件。 本文继续对 uboot顶层 Makefile的前期准备工作进行介绍。续上一篇文章内容的学习,如下: uboot顶层Makefile前期所做工作说明三_凌肖战的博客-CSDN博客   本文主要 了解 uboot顶层 Makefile前期所做的部分工作, 包括

    2024年02月09日
    浏览(30)
  • 嵌入式Linux驱动开发系列六:Makefile

    Makefile是什么? gcc hello.c -o hello gcc aa.c bb.c cc.c dd.c ... make工具和Makefile make和Makefile是什么关系? make工具:找出修改过的文件,根据依赖关系,找出受影响的相关文件,最后按照规则单独编译这些文件。 Makefile文件:记录依赖关系和编译规则。 必须要学精Makefile吗? 怎么学习Makefi

    2024年02月13日
    浏览(47)
  • 基于RK3588的嵌入式linux系统开发(二)——uboot源码移植及编译

            由于官方的SDK占用空间较大(大约20GB左右),需要联系相关供应商提供,且官方的SDK通过各种脚本文件进行集成编译,难以理解系统开发的详细过程。本章介绍直接从官方Github网站下载源码进行移植,进行uboot移植及编译,具体内容如下所述: 1.进入官方的github网

    2024年01月16日
    浏览(44)
  • 【ARM 嵌入式 编译 Makefile 系列 16 - Makefile 伪目标.PHONY 与 FORCE 详细介绍】

    请阅读 【ARM GCC Makefile 编译专栏导读】 .PHONY 是GNU make的一个特殊目标,它用来指定那些不产生文件的目标。如果一个目标被声明为 .PHONY ,那么make命令会忽略这个目标的文件名,即使在文件系统中存在同名的文件,make命令也会每次都执行这个目标的命令 在 Makefile 中, 目标

    2024年02月12日
    浏览(31)
  • 【嵌入式Linux】编译应用和ko内核模块Makefile使用记录

    在Makefile中,变量的赋值可以使用以下几种方式: = :最基本的赋值符号,表示简单的延迟展开(lazy expansion)方式。变量的值将会在使用变量的时候进行展开。 := :立即展开(immediate expansion)的赋值方式。变量的值在赋值的时候立即展开,并且在后续的使用中不再改变。

    2024年02月08日
    浏览(43)
  • 基于RK3588的嵌入式linux系统开发(五)——uboot优化修改(按任意按键停止autoboot)

            我们通常情况下,芯片进入uboot后,会根据设置的bootdelay时间进行倒数计数。这时候在终端按任意键,即可退出autoboot,进入uboot的命令行模式。         官方提供的uboot源码中,为了防止调试串口干扰导致不能进入系统,使用“Ctrl+c”的组合键来退出autoboot。本

    2024年02月10日
    浏览(40)
  • 嵌入式C编译工具:gcc/make/Autotools/cmake

    gcc时GNU编译套件,一种编译器,可以编译c,c++,java等语言。当只有一个文件时,使用gcc编译器就很方便,但是当有多个文件时,编译顺序以及包含关系等使用gcc很麻烦。 make工具:make就相当于一个智能的批处理工具,通过调用makefile实现编译,在makefile规定编译以及链接的顺序

    2024年02月02日
    浏览(40)
  • 【C语言】嵌入式C语言项目管理利器:深入理解Makefile的应用与实践

    目录 一、makedile的概述 1、案例引入 2、makefile  3、Makefile优点 二、makefile的语法规则  1、语法规则 2、简单实战 三、makefile的变量 1、自定义变量 2、系统环境变量 3、预定义变量 4、高级makefile gcc a.c b.c c.c ‐o main 如果只修改了b.c 使用gcc编译 需要对所有文件重新编译。makefi

    2024年02月15日
    浏览(41)
  • 嵌入式Linux开发——解决uboot无法使用nfs服务从ubuntu中下载文件(TTT、cannot mount等错误)

    最近在学习正点原子嵌入式Linux开发板uboot的移植实验,移植完之后想测试网络部分的驱动能否工作正常。最后经过测试发现tftp可以正常下载,nfs却一直报错无法下载文件,最后也是折磨了两天才解决了问题,特写下此博客进行记录、总结。 我的轻薄本没有网口,事先买了一

    2024年01月20日
    浏览(33)
  • 【嵌入式学习笔记】嵌入式基础9——STM32启动过程

    程序段交叉引用关系(Section Cross References):描述各文件之间函数调用关系 删除映像未使用的程序段(Removing Unused input sections from the image):描述工程中未用到被删除的冗余程序段(函数/数据) 映像符号表(Image Symbol Table):描述各符号(程序段/数据)在存储器中的地址、类

    2024年02月15日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包