1. 今天来分析一下makefile,看看如何编译出执行文件pmon的。
先贴几张图,makefile的内容,这是一些依赖关系
图一
图二
图三
图四
图五
2.图一解释
rom这个目标又三个依赖,clean,$START,zloader.o
先执行依赖,再去执行后面的命令。
clean这个目标就不解释了吧,反正就是删除。。。。(图二)
3.图三,start.o是如何生成的?
3.1首先删除原来的start.o
3.2 生成链接脚本ld.script
3.3 到Targets/Bonito3a3000_7a/compile/Bonito/目录中执行makefile
3.4 拷贝start.o到当前路径下。
4.图四,zloader.o是如何生成的?
zloader.o 有依赖。
其中图五的目标也是临时生成的。他的依赖是pmon.bin
zloader.o 是由zloader.c生成,但是它是要先完成依赖。
5.这里要考虑pmon.bin是如何生成的。
这里有一些变量,还得展开,这部分定义在根目录下的makefile.inc文件。
按照变量展开后:
pmon:Makefile ${START} crtbegin.o param.o ioconf.o ri.o ${OBJS} ${LIBC} ${LIBM} ${LIBZ} crtend.o (这里的几个变量不展开了,内容太多,为什么Makefile也是依赖呢?这个Makefile中指定了头文件的包含关系,在# DO NOT DELETE之后说明的那一大段中)
rm -f $@ (第一条命令,删除原来生成的pmon文件,$@表示pmon这个目标)
@echo ${LD} ${LFLAGS} -o $@ ${LIBDIR} '${SYSTEM_OBJ}' vers.o; (这里是打印提示信息)
${LD} ${LFLAGS} -o $@ ${LIBDIR} ${SYSTEM_OBJ} vers.o -L../../../../examples/math/ -lgcc (执行ld指令,生成pmon文件)
@${SIZE} $@ (使用size命令输出pmon文件大小)
chmod 755 $@ ; (修改权限)
${OBJCOPY} -O binary $@ $@.bin (生成pmon.bin文件) 生成bin文件,后来需要解压的c数组,
这个makefile之前被执行过。所以pmon.bin之前就生成了。(第1步的图三中。往上翻)