77范文网 - 专业文章范例文档资料分享平台

U-Boot编译过程完全分析(4)

来源:网络收集 时间:2020-02-21 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

cpu/$(CPU)/$(SOC)/lib$(SOC).a lib_$(ARCH)/lib$(ARCH).a

其余都是与平台无关的。

ifeq ($(CONFIG_NAND_U_BOOT),y) NAND_SPL = nand_spl

U_BOOT_NAND = $(obj)u-boot-nand.bin endif

ifeq ($(CONFIG_ONENAND_U_BOOT),y) ONENAND_IPL = onenand_ipl

U_BOOT_ONENAND = $(obj)u-boot-onenand.bin

ONENAND_BIN ?= $(obj)onenand_ipl/onenand-ipl-2k.bin endif

对于有的开发板,U-Boot支持在NAND Flash启动,这些开发板的配置文件定义了CONFIG_NAND_U_BOOT,

CONFIG_ONENAND_U_BOOT。对于s3c2440,U-Boot原始代码并不支持NAND Flash启动,因此也没有定义这两个宏。 ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND) all:

$(ALL)

其中U_BOOT_NAND与U_BOOT_ONENAND 为空,而u-boot.srec,u-boot.bin,System.map都依赖与u-boot。因此执行“make

all”命令将生成u-boot,u-boot.srec,u-boot.bin,System.map 。其中u-boot是ELF文件,u-boot.srec是Motorola S-Record format文件,System.map 是U-Boot的符号表,u-boot.bin是最终烧写到开发板的二进制可执行的文件。

下面再来分析u-boot.bin文件生成的过程。ELF格式“u-boot”文件生成规则如下:

depend $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds

$(obj)u-boot:

$(GEN_UBOOT)

ifeq ($(CONFIG_KALLSYMS),y)

smap=`$(call SYSTEM_MAP,u-boot) | \\

awk '$$2 ~ /[tTwW]/ {printf $$1 $$3 \

$(CC) $(CFLAGS) -DSYSTEM_MAP=\

-c common/system_map.c -o $(obj)common/system_map.o

$(GEN_UBOOT) $(obj)common/system_map.o

endif

这里生成的$(obj)u-boot目标就是ELF格式的U-Boot文件了。由于CONFIG_KALLSYMS未定义,因此ifeq

($(CONFIG_KALLSYMS),y)与endif间的代码不起作用。

其中depend,$(SUBDIRS),$(OBJS),$(LIBBOARD),$(LIBS),$(LDSCRIPT), $(obj)u-boot.lds是$(obj)u-boot的依

赖,而$(GEN_UBOOT)编译命令。 下面分析$(obj)u-boot的各个依赖:

1依赖目标depend

# Explicitly make _depend in subdirs containing multiple targets to prevent # parallel sub-makes creating .depend files simultaneously.

depend dep: $(TIMESTAMP_FILE) $(VERSION_FILE) $(obj)include/autoconf.mk

for dir in $(SUBDIRS) cpu/$(CPU) $(dir $(LDSCRIPT)) ; do \\

$(MAKE) -C $$dir _depend ; done

对于$(SUBDIRS),cpu/$(CPU),$(dir $(LDSCRIPT))中的每个元素都进入该目录执行“make _depend”,生成各个子目录

的.depend文件,.depend列出每个目标文件的依赖文件。

$(SUBDIRS): depend

$(MAKE) -C $@ all

2依赖SUBDIRS SUBDIRS

= tools \\

examples/standalone \\ examples/api

执行tools ,examples/standalone ,examples/api目录下的Makefile。 3OBJS

OBJS的值是“cpu/arm920t/start.o”。它使用如下代码编译得到:

depend

$(OBJS):

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

以上规则表明,对于OBJS包含的每个成员,都进入cpu/$(CPU)目录(即cpu/arm920t)编译它们。 4LIBBOARD

LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).a

LIBBOARD := $(addprefix $(obj),$(LIBBOARD)) ? ? $(LIBBOARD):

depend $(LIBS)

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

这里LIBBOARD的值是 $(obj)board/samsung/mini2440/libmini2440.a。make执行board/samsung/mini2440/目录下的

Makefile,生成libmini2440.a 。

5LIBS

LIBS变量中的每个元素使用如下的规则编译得到:

depend $(SUBDIRS)

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

$(LIBS):

上面的规则表明,对于LIBS中的每个成员,都进入相应的子目录执行“make”命令编译它们。例如对于LIBS中的

“common/libcommon.a”成员,程序将进入common目录执行Makefile,生成libcommon.a 。

6LDSCRIPT

LDSCRIPT := $(SRCTREE)/cpu/$(CPU)/u-boot.lds ? ? $(LDSCRIPT):

depend

$(MAKE) -C $(dir $@) $(notdir $@)

“$(MAKE) -C $(dir $@) $(notdir $@)”命令经过变量替换后就是“make -C cpu/arm920t/ u-boot.lds”。也就是转

到cpu/arm920t/目录下,执行“make u-boot.lds”命令。

7$(obj)u-boot.lds $(obj)u-boot.lds: $(LDSCRIPT)

$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@

以上执行结果实质上是将cpu/arm920t/u-boot.lds经编译器简单预处理后输出到U-Boot顶层目录下的u-boot.lds文件。

其中的cpu/arm920t/u-boot.lds文件内容如下: /* 输出为ELF文件,小端方式, */

OUTPUT_FORMAT(\OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS {

. = 0x00000000;

. = ALIGN(4); .text : {

/* cpu/arm920t/start.o放在最前面,保证最先执行的是start.o */

cpu/arm920t/start.o

(.text)

/*以下2个文件必须放在前4K,因此也放在前面,其中board/samsung/mini2440/lowlevel_init.o 包含内存初始化所需代码,而 board/samsung/mini2440/nand_read.o 包含U-Boot从NAND Flash搬运自身的代码 */

board/samsung/mini2440/lowlevel_init.o (.text) board/samsung/mini2440/nand_read.o (.text)

/* 其他文件的代码段 */

/* 只读数据段 */

/* 代码段 */

/* u-boot自定义的got段 */

. = .;

__u_boot_cmd_start = .;

/*将 __u_boot_cmd_start指定为当前地址 */

/* 存放所有U-Boot命令对应的cmd_tbl_t结构体 */

. = ALIGN(4); .got : { *(.got) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4);

.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } }

*(.text)

.u_boot_cmd : { *(.u_boot_cmd) } __u_boot_cmd_end = .;

/* 将__u_boot_cmd_end指定为当前地址 */

/* bss段 */ }

u-boot.lds实质上是U-Boot连接脚本。对于生成的U-Boot编译生成的“u-boot”文件,可以使用objdump命令可以查. = ALIGN(4); __bss_start = .;

.bss (NOLOAD) : { *(.bss) . = ALIGN(4); } _end = .;

/* 将_end指定为当前地址 */

看它的分段信息:

$ objdump -x u-boot | more

部分输出信息如下:

u-boot: file format elf32-little u-boot

architecture: UNKNOWN!, flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED start address 0x33f80000

Program Header:

LOAD off 0x00008000 vaddr 0x33f80000 paddr 0x33f80000 align 2**15 filesz 0x0002f99c memsz 0x00072c94 flags rwx

STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2 filesz 0x00000000 memsz 0x00000000 flags rwx Sections:

Idx Name Size VMA LMA File off Algn 0 .text 00024f50 33f80000 33f80000 00008000 2**5 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .rodata 00008b78 33fa4f50 33fa4f50 0002cf50 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 2 .data 00001964 33fadac8 33fadac8 00035ac8 2**2

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库U-Boot编译过程完全分析(4)在线全文阅读。

U-Boot编译过程完全分析(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/jiaoyu/769456.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: