“第09课第2节 u-boot分析之Makefile结构分析”之学习笔记
2014-07-26 09:49
411 查看
分析程序的结构,分析它是如何链接的,最好的分析方法就是分析它的Makefile
make 100ask24x0_config 相当于执行:
100ask24x0_config:unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
MKCONFIG:= $(SRCTREE)/mkconfig
SRCTREE:soure tree 所以以上的指令的意思是在源文件目录下有个mkconfig这个文件
查看下
book@book-desktop:/work/mini2440_system$ cd u-boot-1.1.6/
book@book-desktop:/work/mini2440_system/u-boot-1.1.6$ ls mkconfig
mkconfig //确实有这个文件
所以@$(MKCONFIG)这句话就变成:mkconfig
$@:表示目标文件100ask24x0_config
_config= 被100ask24x0 替换
所以相当于执行
mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
在Makefile中:
# 这个是ELF格式的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
/*==========================================================================================================================*/
执行make,可以看到以下信息
UNDEF_SYM=`arm-linux-objdump -x lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.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/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd /work/mini2440_system/u-boot-1.1.6 && arm-linux-ld -Bstatic -T /work/mini2440_system/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext 0x33F80000 $UNDEF_SYM cpu/arm920t/start.o \
--start-group lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.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/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a --end-group -L /work/mini2440/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5 -lgcc \
-Map u-boot.map -o u-boot
0x33F80000 这个基地址是怎么来的呢?
book@book-desktop:/work/mini2440_system/u-boot-1.1.6$ grep "33f80000" * -nR
System.map:1:33f80000 t $a
System.map:2:33f80000 T _start
u-boot.map:168:.text 0x33f80000 0x247f8
u-boot.map:170: .text 0x33f80000 0x4a0 cpu/arm920t/start.o
u-boot.map:171: 0x33f80000 _start
u-boot.map:1195:Address of section .text set to 0x33f80000
要用大写的33F80000才正确
book@book-desktop:/work/mini2440_system/u-boot-1.1.6$ grep "33F80000" * -nR
board/mpl/vcma9/config.mk:24:TEXT_BASE = 0x33F80000
board/smdk2410/config.mk:25:TEXT_BASE = 0x33F80000
board/sbc2410x/config.mk:23:TEXT_BASE = 0x33F80000
board/100ask24x0/config.mk:25:TEXT_BASE = 0x33F80000 // 可以看出来 TEXT_BASE = 0x33F80000
u-boot.srec:2:S31533F80000170000EA14F09FE514F09FE514F09FE526
u-boot.srec:12195:S31533FAF9F0E4F9FA33F8000000626F6F746172677371
u-boot.srec:12400:S70533F80000CF
book@book-desktop:/work/mini2440_system/u-boot-1.1.6$
注意grep的用法:
格式:grep “查找的内容” * -nR
在顶层目录(\u-boot-1.1.6)的config.mk有这样一条指令:
config.mk:189:LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
这就是LDFLAGS的内容
SDRAM(64M)从0x30000000开始,最上方留512K存放u-boot,如果u-boot大于512K,可以使用TEXT_BASE = 0x33F80000
往下指到合适的地址
从分析编译过程可以得出以下信息:
1. 第一个执行文件:CPU/arm920t/start.S
2. 链接地址:由“board/100ask24x0/u-boot.lds” + 0x33F80000 合成
make 100ask24x0_config 相当于执行:
100ask24x0_config:unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
MKCONFIG:= $(SRCTREE)/mkconfig
SRCTREE:soure tree 所以以上的指令的意思是在源文件目录下有个mkconfig这个文件
查看下
book@book-desktop:/work/mini2440_system$ cd u-boot-1.1.6/
book@book-desktop:/work/mini2440_system/u-boot-1.1.6$ ls mkconfig
mkconfig //确实有这个文件
所以@$(MKCONFIG)这句话就变成:mkconfig
$@:表示目标文件100ask24x0_config
_config= 被100ask24x0 替换
所以相当于执行
mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
在Makefile中:
# 这个是ELF格式的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
/*==========================================================================================================================*/
执行make,可以看到以下信息
UNDEF_SYM=`arm-linux-objdump -x lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.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/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd /work/mini2440_system/u-boot-1.1.6 && arm-linux-ld -Bstatic -T /work/mini2440_system/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext 0x33F80000 $UNDEF_SYM cpu/arm920t/start.o \
--start-group lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.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/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a --end-group -L /work/mini2440/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5 -lgcc \
-Map u-boot.map -o u-boot
0x33F80000 这个基地址是怎么来的呢?
book@book-desktop:/work/mini2440_system/u-boot-1.1.6$ grep "33f80000" * -nR
System.map:1:33f80000 t $a
System.map:2:33f80000 T _start
u-boot.map:168:.text 0x33f80000 0x247f8
u-boot.map:170: .text 0x33f80000 0x4a0 cpu/arm920t/start.o
u-boot.map:171: 0x33f80000 _start
u-boot.map:1195:Address of section .text set to 0x33f80000
要用大写的33F80000才正确
book@book-desktop:/work/mini2440_system/u-boot-1.1.6$ grep "33F80000" * -nR
board/mpl/vcma9/config.mk:24:TEXT_BASE = 0x33F80000
board/smdk2410/config.mk:25:TEXT_BASE = 0x33F80000
board/sbc2410x/config.mk:23:TEXT_BASE = 0x33F80000
board/100ask24x0/config.mk:25:TEXT_BASE = 0x33F80000 // 可以看出来 TEXT_BASE = 0x33F80000
u-boot.srec:2:S31533F80000170000EA14F09FE514F09FE514F09FE526
u-boot.srec:12195:S31533FAF9F0E4F9FA33F8000000626F6F746172677371
u-boot.srec:12400:S70533F80000CF
book@book-desktop:/work/mini2440_system/u-boot-1.1.6$
注意grep的用法:
格式:grep “查找的内容” * -nR
在顶层目录(\u-boot-1.1.6)的config.mk有这样一条指令:
config.mk:189:LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
这就是LDFLAGS的内容
SDRAM(64M)从0x30000000开始,最上方留512K存放u-boot,如果u-boot大于512K,可以使用TEXT_BASE = 0x33F80000
往下指到合适的地址
从分析编译过程可以得出以下信息:
1. 第一个执行文件:CPU/arm920t/start.S
2. 链接地址:由“board/100ask24x0/u-boot.lds” + 0x33F80000 合成
相关文章推荐
- 伟东山视频自学笔记——第9课第2节 u-boot分析之Makefile结构分析
- 韦东山“第09课第1节 u-boot分析之编译体验“之学习笔记
- 04-S3C2440u-boot学习之u-boot分析(2)之Makefile结构分析
- 学习笔记4-项目的目录结构与安装及启动过程分析
- 学习笔记--- U-BOOT 的配置与编译分析
- android 学习笔记(八)底层8.0 学习makefile Android Building System 分析
- Linux netfilter 学习笔记 之三 ip层netfilter的table、rule、match、target结构分析
- [Cocos2d-x for WP8学习笔记] HelloWorld结构分析
- 20160328servlet学习笔记网站代码结构分析MVC结构
- 09课02节 u-boot-1.1.6分析之Makefile结构分析
- TQ2440 学习笔记—— 34、移植 Linux 内核【 Makefile 分析 】
- 学习笔记--- U-BOOT从启动到引导内核过程分析
- linux内核学习初笔记(5)uboot第一阶段我的分析
- u-boot简单学习笔记(二)——AR9331 uboot.lds分析
- FFmpeg学习笔记003_FFmpeg组件结构分析
- TQ2440 学习笔记—— 31、移植U-Boot【U-Boot 的启动过程第二阶段源码分析】
- 黑马程序员--Java基础学习笔记之抽象类和接口、内存结构分析、Java APIs
- Linux netfilter 学习笔记 之三 ip层netfilter的table、rule、match、target结构分析
- u-boot 学习之 config 和 Makefile 分析
- DirectX学习笔记:关于DX Component结构分析