u-boot.bin生成过程分析

发布者:MysticDreamer最新更新时间:2024-11-05 来源: cnblogs关键字:u-boot  bin  生成过程 手机看文章 扫描二维码
随时随地手机看文章

ELF格式“u-boot”文件的生成规则如下,下面对应Makefile的执行过程分别分析各个依赖。


$(obj)u-boot:        depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)

        UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e 's/.*(__u_boot_cmd_.*)/-u1/p'|sort|uniq`;

        cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS)

            --start-group $(__LIBS) --end-group $(PLATFORM_LIBS)

            -Map u-boot.map -o u-boot

1.1 depend依赖,下面的make规则有两个目标,depend和dep 。用depend和dep一样,两个名字而已。


depend dep:

        for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir _depend ; done

对应的makefile执行过程的打印信息如下:


for dir in tools examples post post/cpu ; do make -C $dir _depend ; done

1.2 $(SUBDIRS)依赖,$(SUBDIRS) = tools examples post post/cpu


$(SUBDIRS):

        $(MAKE) -C $@ all

对应的makefile执行过程的打印信息如下:


make -C tools all

make -C examples all

make -C post all

make -C post/cpu all

1.2.1 tool


在tool目录下编译出以下几个可执行文件:


img2srec


mkimage


envcrc


gen_eth_addr


bmp_logo


1.2.2 example


在example目录下生成可执行文件hello_world,-Ttext 0xc10000指定链接地址,-e hello_world指定函数入口地址为int hello_world (int argc, char *argv[]),


可仿照该示例在u-boot中写自己的应用程序。


$(AR)用来打包静态库,可参考 静态库 DIY ar crv, 下面打印信息 a - stubs.o即是$(AR)指令执行输出的日志,表示添加了stubs.o到静态库中。


$(CC) $(CFLAGS) -c -o hello_world.o hello_world.c

$(CC) $(CFLAGS) -c -o stubs.o stubs.c

$(AR) crv libstubs.a stubs.o

a - stubs.o

$(LD) -g  -Ttext 0xc100000

        -o hello_world -e hello_world hello_world.o libstubs.a

        -L$($(shell dirname `$(CC) -print-libgcc-file-name`)) -lgcc

$(OBJCOPY) -O srec hello_world hello_world.srec 2>/dev/null

$(OBJCOPY) -O binary hello_world hello_world.bin 2>/dev/null


1.2.3 post


生成静态库libpost.a。从下面的信息可以大概了解libpost.a的组成及提供的功能。


$(CC) $(AFLAGS) -c -o cache_8xx.o cache_8xx.S

$(CC) $(CFLAGS) -c -o cache.o cache.c

$(CC) $(CFLAGS) -c -o codec.o codec.c

$(CC) $(CFLAGS) -c -o cpu.o cpu.c

$(CC) $(CFLAGS) -c -o dsp.o dsp.c

$(CC) $(CFLAGS) -c -o ether.o ether.c

$(CC) $(CFLAGS) -c -o i2c.o i2c.c

$(CC) $(CFLAGS) -c -o memory.o memory.c

$(CC) $(CFLAGS) -c -o post.o post.c

$(CC) $(CFLAGS) -c -o rtc.o rtc.c

$(CC) $(CFLAGS) -c -o spr.o spr.c

$(CC) $(CFLAGS) -c -o sysmon.o sysmon.c

$(CC) $(CFLAGS) -c -o tests.o tests.c

$(CC) $(CFLAGS) -c -o uart.o uart.c

$(CC) $(CFLAGS) -c -o usb.o usb.c

$(CC) $(CFLAGS) -c -o watchdog.o watchdog.c

$(AR) crv libpost.a stubs.o cache_8xx.o

        cache.o codec.o cpu.o dsp.o ether.o

        i2c.o memory.o post.o rtc.o

        spr.o sysmon.o tests.o uart.o

        usb.o watchdog.o


1.2.4 post/cpu


生成静态库libcpu.a。从下面的信息可以大概了解libcpu.a的组成及提供的功能。


$(CC) $(AFLAGS) -c -o asm.o asm.S

$(CC) $(CFLAGS) -c -o cmp.o cmp.c

$(CC) $(CFLAGS) -c -o cmpi.o cmpi.c

$(CC) $(CFLAGS) -c -o two.o two.c

$(CC) $(CFLAGS) -c -o twox.o twox.c

$(CC) $(CFLAGS) -c -o three.o three.c

$(CC) $(CFLAGS) -c -o threex.o threex.c

$(CC) $(CFLAGS) -c -o threei.o threei.c

$(CC) $(CFLAGS) -c -o andi.o andi.c

$(CC) $(CFLAGS) -c -o srawi.o srawi.c

$(CC) $(CFLAGS) -c -o rlwnm.o rlwnm.c

$(CC) $(CFLAGS) -c -o rlwinm.o rlwinm.c

$(CC) $(CFLAGS) -c -o rlwimi.o rlwimi.c

$(CC) $(CFLAGS) -c -o store.o store.c

$(CC) $(CFLAGS) -c -o load.o load.c

$(CC) $(CFLAGS) -c -o cr.o cr.c

$(CC) $(CFLAGS) -c -o b.o b.c

$(CC) $(CFLAGS) -c -o multi.o multi.c

$(CC) $(CFLAGS) -c -o string.o string.c

$(CC) $(CFLAGS) -c -o complex.o complex.c

$(AR) crv libcpu.a      asm.o

            cmp.o cmpi.o two.o twox.o three.o threex.o threei.o

            andi.o srawi.o rlwnm.o rlwinm.o rlwimi.o

            store.o load.o cr.o b.o multi.o string.o complex.o


1.3 $(OBJS)依赖,$(OBJS) = cpu/s3c64xx/start.o


$(OBJS):

        $(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))

对应的makefile执行过程的打印信息如下:


make -C cpu/s3c64xx start.o

/usr/local/arm/4.3.2/bin/arm-linux-gcc  -D__ASSEMBLY__ -g  -Os   -fno-strict-aliasing  -fno-common -ffixed-r8 -msoft-float  -D__KERNEL__ -DTEXT_BASE=0xCFE00000  -I/home/yjg/arm6410/qudong/01-uboot/uboot_ok6410/include -fno-builtin -ffreestanding -nostdinc -isystem /usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/include -pipe  -DCONFIG_ARM -D__ARM__ -march=armv5t -c -o start.o start.S

上面最后一条执行即


 arm-linux-gcc $(AFLAGS) -c -o start.o start.S

1.4 $(LIBS)依赖 ,$(LIBS)展开如下:


$(LIBS) = 

lib_generic/libgeneric.a

board/samsung/smdk6410/libsmdk6410.a

cpu/s3c64xx/libs3c64xx.a

cpu/s3c64xx/s3c6410/libs3c6410.a

lib_arm/libarm.a

fs/cramfs/libcramfs.a

fs/fat/libfat.a

fs/fdos/libfdos.a

fs/jffs2/libjffs2.a

fs/reiserfs/libreiserfs.a

fs/ext2/libext2fs.a

net/libnet.a

disk/libdisk.a

rtc/librtc.a

dtt/libdtt.a

drivers/libdrivers.a

drivers/nand/libnand.a

drivers/nand_legacy/libnand_legacy.a

drivers/onenand/libonenand.a

drivers/sk98lin/libsk98lin.a

post/libpost.a

post/cpu/libcpu.a

common/libcommon.a


其中与平台相关的是下面几个库


board/samsung/smdk6410/libsmdk6410.a 

cpu/s3c64xx/libs3c64xx.a 

cpu/s3c64xx/s3c6410/libs3c6410.a 

lib_arm/libarm.a 

该目标的规则如下,LIBS表示的每个库文件,都是由进入相应的子目录执行“make”命令编译得到的。


$(LIBS):

        $(MAKE) -C $(dir $(subst $(obj),,$@))

例如,对于LIBS中的“common/libcommon.a”成员,程序将进入common目录执行make命令,生成libcommon.a,最终生成libcommon.a的链接命令如下:


/usr/local/arm/4.3.2/bin/arm-linux-ar crv libcommon.a main.o ACEX1K.o altera.o bedbug.o circbuf.o cmd_ace.o cmd_autoscript.o cmd_bdinfo.o cmd_bedbug.o cmd_bmp.o cmd_boot.o cmd_bootm.o cmd_cache.o cmd_console.o cmd_date.o cmd_dcr.o cmd_diag.o cmd_display.o cmd_doc.o cmd_dtt.o cmd_eeprom.o cmd_elf.o cmd_ext2.o cmd_fat.o cmd_fdc.o cmd_fdos.o cmd_flash.o cmd_fpga.o cmd_i2c.o cmd_ide.o cmd_immap.o cmd_itest.o cmd_jffs2.o cmd_load.o cmd_log.o cmd_mem.o cmd_mii.o cmd_misc.o cmd_mmc.o cmd_nand.o cmd_net.o cmd_nvedit.o cmd_pci.o cmd_pcmcia.o cmd_portio.o cmd_reginfo.o cmd_reiser.o cmd_scsi.o cmd_spi.o cmd_universe.o cmd_usb.o cmd_vfd.o command.o console.o cyclon2.o devices.o dlmalloc.o docecc.o environment.o env_common.o env_nand.o env_dataflash.o env_flash.o env_eeprom.o env_nvram.o env_nowhere.o env_movi.o env_onenand.o exports.o flash.o fpga.o ft_build.o hush.o kgdb.o lcd.o lists.o lynxkdi.o memsize.o miiphybb.o miiphyutil.o s_record.o serial.o soft_i2c.o soft_spi.o spartan2.o spartan3.o usb.o usb_kbd.o usb_storage.o virtex2.o xilinx.o crc16.o xyzModem.o cmd_mac.o cmd_onenand.o cmd_usbd.o cmd_movi.o

上面执行的即为 


arm-linux-ar crv $@ $^

以上各种库所包含的*.o文件整理如下:


lib_generic/libgeneric.a :

    bzlib.o bzlib_crctable.o bzlib_decompress.o

    bzlib_randtable.o bzlib_huffman.o

    crc32.o ctype.o display_options.o div64.o ldiv.o

    string.o vsprintf.o zlib.o    

      

board/samsung/smdk6410/libsmdk6410.a :

    smdk6410.o flash.o

    lowlevel_init.o

    

cpu/s3c64xx/libs3c64xx.a :

    nand_cp.o i2c.o serial.o  usb_ohci.o

    interrupts.o cpu.o nand.o onenand.o onenand_cp.o

    usbd-otg-hs.o hs_mmc.o movi.o

    

cpu/s3c64xx/s3c6410/libs3c6410.a :

    cpu_init.o

    speed.o

    

lib_arm/libarm.a :

    _ashldi3.o _ashrdi3.o _divsi3.o _modsi3.o _udivsi3.o _umodsi3.o

    armlinux.o board.o

    cache.o div0.o

    

fs/cramfs/libcramfs.a :

    cramfs.o uncompress.o

    

fs/fat/libfat.a :

     fat.o file.o

     

fs/fdos/libfdos.a :

    fat.o vfat.o dev.o fdos.o fs.o subdir.o

    

fs/jffs2/libjffs2.a :

    jffs2_1pass.o compr_rtime.o compr_rubin.o compr_zlib.o mini_inflate.o

    compr_lzo.o compr_lzari.o

        

fs/reiserfs/libreiserfs.a:

    reiserfs.o dev.o mode_string.o

     

fs/ext2/libext2fs.a 

    ext2fs.o dev.o

    

net/libnet.a :

    net.o tftp.o bootp.o rarp.o eth.o nfs.o sntp.o

    

disk/libdisk.a :

    part.o part_mac.o part_dos.o part_iso.o part_amiga.o

    

rtc/librtc.a :

    date.o   

    bf533_rtc.o ds12887.o ds1302.o ds1306.o ds1307.o

    ds1337.o ds1374.o ds1556.o ds164x.o ds174x.o

    m41t11.o max6900.o m48t35ax.o mc146818.o mk48t59.o

    mpc5xxx.o mpc8xx.o pcf8563.o s3c24x0_rtc.o rs5c372.o

    s3c24xx_rtc.o s3c64xx_rtc.o

    

dtt/libdtt.a :

    lm75.o ds1621.o adm1021.o

    

drivers/libdrivers.a :

      3c589.o 5701rls.o ali512x.o atmel_usart.o

      bcm570x.o bcm570x_autoneg.o cfb_console.o cfi_flash.o

      cs8900.o ct69000.o dataflash.o dc2114x.o dm9000x.o

      e1000.o eepro100.o

      i8042.o inca-ip_sw.o keyboard.o

      lan91c96.o

      natsemi.o ne2000.o netarm_eth.o netconsole.o

      ns16550.o ns8382x.o ns87308.o ns7520_eth.o omap1510_i2c.o

      omap24xx_i2c.o pci.o pci_auto.o pci_indirect.o

      pcnet.o plb2800_eth.o

      ps2ser.o ps2mult.o pc_keyb.o

      rtl8019.o rtl8139.o rtl8169.o

      s3c4510b_eth.o s3c4510b_uart.o

      sed13806.o sed156x.o

      serial.o serial_max3100.o

      serial_pl010.o serial_pl011.o serial_xuartlite.o

      sl811_usb.o sm501.o smc91111.o smiLynxEM.o

      status_led.o sym53c8xx.o ahci.o

      ti_pci1410a.o tigon3.o tsec.o

      usbdcore.o usbdcore_ep0.o usbdcore_omap1510.o usbtty.o

      videomodes.o w83c553f.o

      ks8695eth.o

      pxa_pcmcia.o mpc8xx_pcmcia.o tqm8xx_pcmcia.o   

      rpx_pcmcia.o

      fsl_i2c.o

      smc911x.o

      

[1] [2]
关键字:u-boot  bin  生成过程 引用地址:u-boot.bin生成过程分析

上一篇:Linux中断体系结构
下一篇:machine_desc

推荐阅读最新更新时间:2024-11-09 11:17

S3C6410移植u-boot-2010.3(5)Dnw for linux
  现在开始记录在linux上安装dnw功能   想要源代码,可以到这里fork https://github.com/Qunero/dnw4linux   详细的使用,README里面讲得很清楚了,不加赘述了。   这里只讲一下怎么使用。   1、加载模块.ko文件 $ cd secbulk_driver/ $ insmod secbulk.ko   然后确认一下已经加载 $ lsmod | grep secbulk //若正确加载了,应该有回显 secbulk 12728 0   2、插入USB to miniUSB线   然后查看一下系统信息 $ dmesg //正常情况下应
[单片机]
u-boot顶层目录config.mk分析
1. 设置obj与src ifneq ($(OBJTREE),$(SRCTREE)) ifeq ($(CURDIR),$(SRCTREE)) dir := else dir := $(subst $(SRCTREE)/,,$(CURDIR)) endif obj := $(if $(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/) src := $(if $(dir),$(SRCTREE)/$(dir)/,$(SRCTREE)/) $(shell mkdir -p $(obj)) else obj := src := endif 一般目标输出到源代码目录下,因此执行完上面的代码后,src和o
[单片机]
基于WT2003H0语音芯片在扫地机/智能桌游等产品更换语音bin应用设计方案
一:产品市场 随着家用电子设备的普及,各种智能化设备进入人们生活中,如洗地机、扫地机、共享单车、智能门锁、智能桌游、智能网关等,客户想方便快捷的更换替换产品的音频文件。针对部分客户自主更换语音内容的需求,定制化的语音方案,唯创知音WT2003H0系列语音芯片远程更换语音bin的功能无疑是一个很好的选择。 本文以WT2003H0系列语音芯片为例,与唯创知音其余的WT2003H系列串口更新语音bin(bin文件包含运行程序+语音)不同,唯创知音新推出的这款芯片功能,为直接替换语音bin文件,由MP3、WAV格式合成,不包含运行程序。 扫地机 、共享单车 、智能门锁 二: 产品框架图 语音更换 三:芯片功能特点 1:工作电压
[嵌入式]
基于WT2003H0语音芯片在扫地机/智能桌游等产品更换语音<font color='red'>bin</font>应用设计方案
18.U-boot的工作流程分析-210
210启动流程: 前面在2440和6410中虽然有BL1和BL2之分,210也是一样的:
[单片机]
18.U-boot的工作流程分析-210
[JZ2440] 配置编译 U-Boot
一、相关资料获取   我个人在学习 mini2440 开发板时是跟着韦东山老师的视频学习的,视频和资料可以访问百问网论坛获取。   百问网论坛链接: http://www.100ask.net/bbs/forum.php   下载好资料后在 JZ2440资料光盘 文件中 systems 目录下可以获取到 u-boot-1.1.6.tar.bz2(U-Boot 源码包)和 u-boot-1.1.6_jz2440.patch(韦东山老师移植到 S3C2440 处理器的 patch 包)。 二、配置编译 U-Boot   1. 将下载好的 U-Boot 源码包和对应的 Patch 包复制到 Ubuntu 虚拟机
[单片机]
U-boot-2014.04移植到MINI2440(10) 移植nand flash保存环境变量、添加分区
一.保存环境变量到nand flash 第一步:修改mini2440.h 由于我们执行saveenv这个命令,然后保存环境变量,u-boot的命令都是在common下实现的,切进去执行gerp “saveenv” –nr ./*.c,查找出如下结果: 这里出现了很多,打开Makefile: # environment obj-y += env_attr.o obj-y += env_callback.o obj-y += env_flags.o obj-$(CONFIG_ENV_IS_IN_DATAFLASH) +=env_dataflash.o obj-$(CONFIG_ENV_IS_IN_E
[单片机]
U-boot-2014.04移植到MINI2440(10) 移植nand flash保存环境变量、添加分区
基于S3C2410开发板的U-BOOT移植解决方案
引言 随着嵌入式系统的日趋复杂,它对大容量数据存储的需求越来越紧迫。而嵌入式设备低功耗、小体积以及低成本的要求,使硬盘无法得到广泛的应用。NAND闪存设备就是为了满足这种需求而迅速发展起来的。目前关于U-BOOT的移植解决方案主要面向的是微处理器中的NOR 闪存,如果能在微处理器上的NAND 闪存中实现U-BOOT的启动,则会给实际应用带来极大的方便。 U-BOOT简介 U-BOOT 支持ARM、 PowerPC等多种架构的处理器,也支持Linux、NetBSD和VxWorks等多种操作系统,主要用来开发嵌入式系统初始化代码bootloader。bootloader是芯片复位后进入操作系统之前执行的一段代码,完成由硬件启动到操
[单片机]
基于S3C2410开发板的<font color='red'>U-BOOT</font>移植解决方案
Linux移植之子目录下的built-in.o生成过程分析
在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/ar
[单片机]
Linux移植之子目录下的built-in.o<font color='red'>生成</font><font color='red'>过程</font>分析
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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