当前位置: 首页 > ai >正文

u-boot编译流程简要分析

0、说明

本文基于U-Boot 2022.01-v2.07版本进行分析。

1、u-boot的编译过程

  • 1.1、参考资料
    u-boot的编译系统介绍可以参考:U-Boot 完全分析与移植,这篇文章。

  • 1.2、编译入口
    在执行make编译u-boot时,由于没有指定目标,因此执行的是顶层Makefile中的第一个目标。在顶层Makefile中,从文件开头往下查找第一个编译目标,会找到如下部分:

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

    会发现这里的_all没有做任何操作,也没有任何依赖,继续往下找,会发现_all会重载:

    # Use make M=dir to specify directory of external module to build
    # Old syntax make ... SUBDIRS=$PWD is still supported
    # Setting the environment variable KBUILD_EXTMOD take precedence
    ifdef SUBDIRS
    KBUILD_EXTMOD ?= $(SUBDIRS)
    endififeq ("$(origin M)", "command line")
    KBUILD_EXTMOD := $(M)
    endif# If building an external module we do not care about the all: rule
    # but instead _all depend on modules
    PHONY += all
    ifeq ($(KBUILD_EXTMOD),)
    _all: all
    else
    _all: modules
    endif
    

    由于执行make是我们没有指定M=dir,因此这里的KBUILD_EXTMOD就为空,ifeq ($(KBUILD_EXTMOD),)就为真,最终_all:被重载为_all: all,如下:

    # 找到的第一个目标
    PHONY := _all
    _all:# KBUILD_EXTMOD为空,进行了重载
    PHONY += all
    _all: all
    

    这里_all依赖于all,需要确定all做了哪些事情,继续往下找:

    all: .binman_stamp inputs
    ifeq ($(CONFIG_BINMAN),y)$(call if_changed,binman)
    endif
    

    这里会发现,all依赖于.binman_stampinputs,重点在inputs:

    PHONY += inputs
    inputs: $(INPUTS-y)
    

    继续看INPUTS-y的赋值:

    INPUTS-y += u-boot.srec u-boot.bin u-boot.sym System.map binary_size_check
    

    INPUTS-y有多个值,重点关注u-boot.bin,其取决于uboot的配置项。在我的配置项中,其取值如下:

    u-boot.bin: u-boot-dtb.bin FORCE$(call if_changed,copy)
    

    继续看u-boot-dtb.bin,就在它上面:

    u-boot-dtb.bin: u-boot-nodtb.bin dts/dt.dtb FORCE$(call if_changed,cat)
    

    dts/dt.dtb是来编译设备树的,重点看u-boot-nodtb.bin:

    u-boot-nodtb.bin: u-boot FORCE$(call if_changed,objcopy_uboot)$(BOARD_SIZE_CHECK)
    

    继续看u-boot

    u-boot:	$(u-boot-init) $(u-boot-main) $(u-boot-keep-syms-lto) u-boot.lds FORCE+$(call if_changed,u-boot__)
    ifeq ($(CONFIG_KALLSYMS),y)$(call cmd,smap)$(call cmd,u-boot__) common/system_map.o
    endif
    

    u-boot-keep-syms-lto不用管,u-boot.lds是用于生成链接脚本的,暂且不管。重点看u-boot-initu-boot-main:

    u-boot-init := $(head-y)
    u-boot-main := $(libs-y)
    

    head-y的定义在arch\arm\Makefile文件中,用于编译对应目录中的start.s文件:

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

http://www.xdnf.cn/news/10921.html

相关文章:

  • OC内存管理
  • 实战 DeviceIoControl 之五:列举已安装的存储设备
  • Android jetpack最佳总结和实践
  • Windows CE 模拟器和远程调试工具
  • 按钮提交表单
  • 关于MySQL的文献M_什么是参考文献?文献类型标识码有,M、J、C、N、D、P、S、DB/OL、J/OL、N/OL等它们都代表什么意思?(提...
  • 中标麒麟服务器系统安装教程,安装国产Linux中标麒麟操作系统教程
  • 提升交际能力:8个技巧避免尬聊,寻找话题轻松聊天
  • 怎么完全卸载赛门铁克_赛门铁克(sep)卸载方法
  • 技术人如何搭建自己的技术博客
  • ARP病毒全析
  • Linux——sort命令详细使用方法
  • 新手学编程必会的100个代码
  • FR-E840-K 第二加减速使用方法
  • 网站流量统计分析
  • 你也能轻松破解CNKI 密码
  • QSetting
  • MySQL--内连接查询(inner join)
  • ARM嵌入式
  • OpenGL入门系列- 编程指南例子解析 opengl_wrap
  • 游戏引擎列表
  • 爬虫入门练习
  • 在线拍卖系统(竞拍系统)源码编写开发中拍卖模式的理解和实现
  • 安卓app 实现监听手机app全局弹窗消息通知功能
  • git stash介绍(贮藏、暂存)(临时保存当前工作目录中尚未提交的修改)
  • 蓝桥杯国赛训练 day1
  • 6.4 note
  • c++ algorithm
  • 互联网 Web 网站
  • flex布局实现固定区域滚动