01.uboot分析之makefile结构分析

举报
嵌入式与Linux那些事 发表于 2022/03/29 00:41:25 2022/03/29
【摘要】 一、分析配置过程(make 100ask24x0_config) 1.执行make 100ask24x0_config配置uboot时,就相当于执行下面红框中的话。 MKCONFIG := $(SR...
一、分析配置过程(make 100ask24x0_config)

1.执行make 100ask24x0_config配置uboot时,就相当于执行下面红框中的话。
在这里插入图片描述

MKCONFIG	:= $(SRCTREE)/mkconfig/*源文件所在的目录下面找mkconfig*/


100ask24x0_config	:	unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0/*$,@表示目标是100ask24x0_config,
														执行的时候100ask24x0_config替换_config=*/
mkconfig 100ask24x0  arm arm920t 100ask24x0 NULL s3c24x0/*执行配置命令就相当于执行这句话*/

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.在目录下找到mkconfig 文件。

/*分析命令传入的参数是否有 -- -a 等。*/
while [ $# -gt 0 ] ; do
	case "$1" in
	--) shift ; break ;;
	-a) shift ; APPEND=yes ;;
	-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
	*)  break ;;
	esac
done

/*BOARD_NAME是否定义,定义就执行第一句,否则第二句*/
/*linux脚本中  $表示参数*/
/*mkconfig 100ask24x0  arm arm920t 100ask24x0 NULL s3c24x0*/
/*   $0      $1        $2   $3       $4        $5   $6*/
/*执行完下面这句话,相当于 BOARD_NAME = 100ask24x0  */
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"

/*判断参数的个数,小于4个或者大于6个就退出*/
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1

/*打印这句话*/
echo "Configuring for ${BOARD_NAME} board..."

/*SRCTREE OBJTREE 两个区是否相等*/
/*打开makefile文件,可以看到
OBJTREE		:= $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))是否定义BUILD_DIR,定义的话OBJTREE = BUILD_DIR,否则	OBJTREE = CURDIR。文件中没有定义,所以OBJTREE = CURDIR
SRCTREE		:= $(CURDIR)*/
/*条件不成立*/
if [ "$SRCTREE" != "$OBJTREE" ] ; then
	mkdir -p ${OBJTREE}/include
	mkdir -p ${OBJTREE}/include2
	cd ${OBJTREE}/include2
	rm -f asm
	ln -s ${SRCTREE}/include/asm-$2 asm
	LNPREFIX="../../include2/asm/"
	cd ../include
	rm -rf asm-$2
	rm -f asm
	mkdir asm-$2
	ln -s asm-$2 asm
else
	cd ./include
	rm -f asm
	/*ln -s asm-arm asm 建立一个指向asm-arm架构的链接文件*/
	ln -s asm-$2 asm 
fi
/*删除 -f asm-$2(arm)/arch*/
rm -f asm-$2/arch

/*如果第六个参数为空或者为NULL就会执行下面一句话,显然不满足*/
if [ -z "$6" -o "$6" = "NULL" ] ; then
	ln -s ${LNPREFIX}arch-$3 asm-$2/arch

/*下面这句话相当于执行 ln -s arch-s3c24x0 asm-arm/arch*/
/*建立一个指向arch-s3c24x0的链接文件arch*/
else
	ln -s ${LNPREFIX}arch-$6 asm-$2/arch

/*如果 "$2" = "arm"相等*/
/*建立一个一个指向proc-armv的链接文件proc*/
if [ "$2" = "arm" ] ; then
	rm -f asm-$2/proc
	ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
/*生成一个config.mk配置文件,>表示新建一个文件。>>表示把内容追加过去*/
/*执行完三条语句后,config.mk为下面的内容*/
/*ARCH=arm 
CPU = arm920t 
BOARD = 100ask24x0*/
#
# Create include file for Make
#
echo "ARCH   = $2" >  config.mk
echo "CPU    = $3" >> config.mk
echo "BOARD  = $4" >> config.mk

/*第五个参数存在并且不为NULL,再增加一项内容"VENDOR = $5"。显然不成立*/
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk

/*第六个参数存在并且不为NULL,再增加一项内容"SOC= $6" 成立 */
/*config.mk中内容*/
/*ARCH=arm 
CPU = arm920t 
BOARD = 100ask24x0
SOC  =s3c24x0*/
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk

/*APPEND 不成立*/
#
# Create board specific header file
#
if [ "$APPEND" = "yes" ]	# Append to existing config file
then
	echo >> config.h
/*新建一个config.h*/
else
	> config.h		# Create new config file
fi
/*把信息追加到config.h*/
/*config.h内容*/
/* Automatically generated - do not edit */
/*#include <configs/100ask24x0.h>*/

echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
二、编译过程(make命令)

分析makefile

/*包含include 下的config.mk。文件内容如上*/
include $(OBJTREE)/include/config.mk

/*如果是arm架构,编译工具链arm-linux-*/
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
endif

/*CPU=arm920t*/
OBJS  = cpu/$(CPU)/start.o

/*BOARD=BOARDDIR=100ask24x0,CPU=arm920t*/
LIBS  = lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a

/*make的时候,如果不指定目标,就是生成all目标*/
/*all依赖于ALL*/
/*目的是要生成u-boot.bin*/
ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)

all:		$(ALL)

/*u-boot.bin依赖于u-boot*/
/*u-boot.bin二进制文件 u-boot elf格式*/
$(obj)u-boot.bin:	$(obj)u-boot
		$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@

/*u-boot又依赖于下面的文件*/
$(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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
三、分析结论

1.程序执行的第一个文件 cpu/arm920t/start.s
2.链接地址的定义:board/100ask24x0/u-boot.lds +0x33f80000(config.mk中定义的0x33f80000,修改TEXT_BASE=0x33f80000可以重新定义uboot的起始地址)

文章来源: blog.csdn.net,作者:嵌入式与Linux那些事,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_16933601/article/details/102808761

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。