u-boot顶层Makefile分析

1.u-boot制作命令

make forlinx_nand_ram256_config;

make all;

2.顶层mkconfig分析,参考 U-BOOT顶层目录mkconfig分析

mkconfig脚本执行后会生成以下3个文件,这些文件中提供的变量会在Makefile中其它地方使用。

116 # load ARCH, BOARD, and CPU configuration
117 include $(OBJTREE)/include/config.mk
118 export    ARCH CPU BOARD VENDOR SOC

./include/config.mk

./board/samsung/smdk6410/config.mk

./include/config.h

3.顶层config.mk分析,参考 u-boot顶层目录config.mk分析

这个文件设置的变量会在Makefile其它地方使用。

4.变量打印,修改Makefile查看变量的具体内容。

display1:
    @echo "PLATFORM_RELFLAGS : $(PLATFORM_RELFLAGS)"
    @echo "PLATFORM_CPPFLAGS : $(PLATFORM_CPPFLAGS)"
    @echo "CPPFLAGS : $(CPPFLAGS)"
    @echo "CFLAGS : $(CFLAGS)"
    @echo "AFLAGS : $(AFLAGS)"
    @echo "LDFLAGS : $(LDFLAGS)"
    @echo "CPP: $(CPP)"
    @echo "MAKE: $(MAKE)"
    @echo "CROSS_COMPILE: $(CROSS_COMPILE)"
    @echo "BOARDDIR : $(BOARDDIR)"
    @echo "HOSTCC : $(HOSTCC)"
    @echo "HOSTCFLAGS : $(HOSTCFLAGS)"
    @echo "ALL : $(ALL)"
    @echo "SUBDIRS : $(SUBDIRS)"
    @echo "OBJS : $(OBJS)"
    @echo "__OBJS : $(__OBJS)"
    @echo "LIBS : $(LIBS)"
    @echo "__LIBS : $(__LIBS)"
    @echo "LDSCRIPT: $(LDSCRIPT)"

执行make display1即可查看到各个变量的具体值如下:

 1 PLATFORM_RELFLAGS :  -fno-strict-aliasing  -fno-common -ffixed-r8 -msoft-float
 2 PLATFORM_CPPFLAGS :  -DCONFIG_ARM -D__ARM__ -march=armv5t
 3 CPPFLAGS : -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
 4 CFLAGS : -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 -Wall -Wstrict-prototypes
 5 AFLAGS :  -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
 6 LDFLAGS : -Bstatic -T /home/yjg/arm6410/qudong/01-uboot/uboot_ok6410/board/samsung/smdk6410/u-boot.lds -Ttext 0xCFE00000
 7 CPP: /usr/local/arm/4.3.2/bin/arm-linux-gcc -E
 8 MAKE: make
 9 CROSS_COMPILE: /usr/local/arm/4.3.2/bin/arm-linux-
10 BOARDDIR : samsung/smdk6410
11 HOSTCC : gcc
12 HOSTCFLAGS : -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
13 ALL : u-boot.srec u-boot.bin System.map
14 SUBDIRS : tools examples post post/cpu
15 OBJS : cpu/s3c64xx/start.o
16 __OBJS : cpu/s3c64xx/start.o
17 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
18 __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
19 LDSCRIPT: /home/yjg/arm6410/qudong/01-uboot/uboot_ok6410/board/samsung/smdk6410/u-boot.lds

make display1

5. make u-boot分析,参考 详细分析make uboot 最后的编译链接的具体执行过程

$(obj)u-boot:        depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
        UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e ‘s/.*\(__u_boot_cmd_.*\)/-u\1/p‘|sort|uniq`;        cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS)             --start-group $(__LIBS) --end-group $(PLATFORM_LIBS)             -Map u-boot.map -o u-boot

上述目标的生成可分解为3个步骤:

5.1 确定UNDEF_SYM变量值

打印出UNDEF_SYM变量值如下,其中的-u__u_boot_cmd_xxx用作arm-linux-ld命令的参数,意思就是,在ld的时候不定义这些符号,即不定义__u_boot_cmd_xxx,等等这些符号,我的理解是因为开始需要从某个库中载入其他的符号,而这个时候还没有载入到那个包含此符号定义的库,所以暂时先加入这个-u说明,先不定义这些符号,等到所有的库都加载完了再去找这些符号的定义,此时已经加载完所有的库了,也就能找到这些符号的定义了。

-u__u_boot_cmd_base
-u__u_boot_cmd_bdinfo
-u__u_boot_cmd_bootelf
-u__u_boot_cmd_bootm
-u__u_boot_cmd_bootp
-u__u_boot_cmd_bootvx
-u__u_boot_cmd_branch
-u__u_boot_cmd_cmp
-u__u_boot_cmd_cp
-u__u_boot_cmd_crc32
-u__u_boot_cmd_date
-u__u_boot_cmd_dcache
-u__u_boot_cmd_dnw
-u__u_boot_cmd_echo
-u__u_boot_cmd_end
-u__u_boot_cmd_erase
-u__u_boot_cmd_exit
-u__u_boot_cmd_fatinfo
-u__u_boot_cmd_fatload
-u__u_boot_cmd_fatls
-u__u_boot_cmd_flinfo
-u__u_boot_cmd_go
-u__u_boot_cmd_help
-u__u_boot_cmd_icache
-u__u_boot_cmd_imls
-u__u_boot_cmd_itest
-u__u_boot_cmd_loadb
-u__u_boot_cmd_loads
-u__u_boot_cmd_loady
-u__u_boot_cmd_loop
-u__u_boot_cmd_md
-u__u_boot_cmd_mm
-u__u_boot_cmd_movi
-u__u_boot_cmd_mtest
-u__u_boot_cmd_mw
-u__u_boot_cmd_nand
-u__u_boot_cmd_nboot
-u__u_boot_cmd_nfs
-u__u_boot_cmd_nm
-u__u_boot_cmd_ping
-u__u_boot_cmd_printenv
-u__u_boot_cmd_protect
-u__u_boot_cmd_question_mark
-u__u_boot_cmd_rarpboot
-u__u_boot_cmd_reset
-u__u_boot_cmd_saveenv
-u__u_boot_cmd_setenv
-u__u_boot_cmd_sleep
-u__u_boot_cmd_start
-u__u_boot_cmd_test
-u__u_boot_cmd_tftpboot
-u__u_boot_cmd_usb
-u__u_boot_cmd_version

UNDEF_SYM:

5.2 切换到u-boot顶层目录

5.3 arm-linux-ld链接生成最终elf类型的u-boot。

这里要注意连接器脚本文件u-boot.lds

LDFLAGS : -Bstatic -T /home/yjg/arm6410/qudong/01-uboot/uboot_ok6410/board/samsung/smdk6410/u-boot.lds -Ttext 0xCFE00000

从其中可以发现cpu/s3c64xx/start.S是u-boot执行的第一个文件,后面就从这个函数入手分析u-boot的启动流程。

 1 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
 2 /*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
 3 OUTPUT_ARCH(arm)
 4 ENTRY(_start)
 5 SECTIONS
 6 {
 7     . = 0x00000000;
 8
 9     . = ALIGN(4);
10     .text      :
11     {
12       cpu/s3c64xx/start.o    (.text)
13       cpu/s3c64xx/s3c6410/cpu_init.o    (.text)
14       cpu/s3c64xx/onenand_cp.o    (.text)
15       cpu/s3c64xx/nand_cp.o    (.text)
16       cpu/s3c64xx/movi.o (.text)
17       *(.text)
18       lib_arm/div0.o
19     }
20
21     . = ALIGN(4);
22     .rodata : { *(.rodata) }
23
24     . = ALIGN(4);
25     .data : { *(.data) }
26
27     . = ALIGN(4);
28     .got : { *(.got) }
29
30     __u_boot_cmd_start = .;
31     .u_boot_cmd : { *(.u_boot_cmd) }
32     __u_boot_cmd_end = .;
33
34     . = ALIGN(4);
35     .mmudata : { *(.mmudata) }
36
37     . = ALIGN(4);
38     __bss_start = .;
39     .bss : { *(.bss) }
40     _end = .;
41 }
时间: 2024-10-05 18:33:26

u-boot顶层Makefile分析的相关文章

u-boot-2016.09顶层makefile分析

## SPDX-License-Identifier: GPL-2.0+# VERSION = 2016PATCHLEVEL = 09SUBLEVEL =EXTRAVERSION =NAME = # *DOCUMENTATION*# To see a list of typical targets execute "make help"# More info can be located in ./README# Comments in this file are targeted o

嵌入式 Linux开发Kernel移植(三)——Kernel工程Makefile分析

嵌入式 Linux开发Kernel移植(三)--Kernel工程Makefile分析 本文选择三星发布的基于SMDKV210开发板的linux 2.6.35.7版本kernel. 一.Kernel Makefle体系简介 1.Kernel Makefile体系组成 Kernel Makefile体系包含Kconfig和Kbuild两个系统. Kconfig系统 Kconfig 对应的是内核配置阶段,make xxconfig就是在使用Kconfig系统.Kconfig由三部分组成: script

u-boot的Makefile分析

由顶层Makefile文件,梳理U-Boot的编译流程. 小技巧: 在大型Makefile中,很多时候需要确定某个变量的值,一个小方法就是: $(shell echo "VARIABLE0_VAL = $(VARIABLE0_VAL)" > v_file.txt ) $(shell echo "VARIABLE1_VAL = $(VARIABLE1_VAL)" >> v_file.txt ) 1.首先,确定make过程中需要的变量(Makefile

uboot移植之makefile分析

/* Name:uboot之makefile分析 Data:2015-3-3 Author:suj_un */ Uboot之makefile分析 编译uboot,内核或者其他软件只需要执行make命令就可以生成可执行文件.执行命令后是怎么工作的?要知道这个就要看makefile了.现在就来揭开这玩意神秘的面纱.其中会粘一些代码段来分析... VERSION = 2010 PATCHLEVEL = 03 SUBLEVEL = EXTRAVERSION = ifneq "$(SUBLEVEL)&qu

《Linux内核Makefile分析》之 auto.conf, auto.conf.cmd, autoconf.h【转】

转自:http://blog.sina.com.cn/s/blog_87c063060101l25y.html 转载:http://blog.csdn.net/lcw_202/article/details/6661364 在编译构建性目标时(如 make vmlinux),顶层 Makefile 的 $(dot-config) 变量值为 1 . 在顶层 Makefile 的 497-504 行看到: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

uboot主Makefile分析(t配置和编译过程详解)

1.编译uboot前需要三次make make distcleanmake x210_sd_configmake -j4 make distclean为清楚dist文件. make x210_sd_config  跳转执行mkconfig用来配置并生成config.mk(board/samsung/x210目录下为指定链接地址的与主uboot目录的config.mk不同) autuconfig.mk 2.框图 3.uboot主Makefile分析 3.1.uboot version确定(Make

Tiny4412 uboot Makefile 分析

* Build uboot a) 安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)并设置好 环境变量PATH,保证可以正常使用.b) 解压 uboot_tiny4412-20130729.tgz 并进入相应的目录 tar xzf uboot_tiny4412-20130729.tgzc) 配置 uboot 并编译 cd uboot_tiny4412 make tiny4412_config maked) 编译 用于生成bl2 的工具 m

Linux驱动模块的Makefile分析【转】

本文转载自:http://blog.chinaunix.net/uid-29307109-id-3993784.html 1. 获取内核版本 当设备驱动需要同时支持不同版本内核时,在编译阶段,内核模块需要知道当前使用的内核源码的版本,从而使用相应的内核 API.2.4 与 2.6 内核下,源码头文件 linux/version.h 定义有: LINUX_VERSION_CODE ― 内核版本的二进制表示,主.从.修订版本号各对应一个字节: KERNEL_VERSION(major, minor,

nova boot代码流程分析(三):nova与neutron的交互(2)

继续<nova boot代码流程分析(三):nova与neutron的交互(1)>的分析. #/nova/virt/libvirt/driver.py:LibvirtDriver # NOTE(ilyaalekseyev): Implementation like in multinics # for xenapi(tr3buchet) def spawn(self, context, instance, image_meta, injected_files, admin_password,