当前位置: 首页 > 工具软件 > devkitPro > 使用案例 >

DevKitPro(GBA),MakeFile文件大概分析(编译)

谢正初
2023-12-01

前言:我对makefile文件不是很熟悉,所以只能大概分析一下

makefile文件分析

一, 判断两个关键系统变量 $(DEVKITARM)和$(DEVKITPRO),注:引用库路径都是根据这两个变量的

二, 引用gba_ruls文件,和base_ruls文件

三, 初始化所有变量

四, 编译所有文件,当遇到*.bin文件时,执行 bin2s $(outfile) || $(AS) -o $(outfile) <此命令在gba_rules文件中> (注:先把二进制文件转化成 汇编文件,然后汇编器输出对象文件,在linux下,命令或许有更改)

bin2s,二进制输出汇编文件

五, 编译main.c文件,输出对象文件后,使用链接器(LD),链接文件

链接文件,$(LD) -specs=gba_mb.specs $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@<此命令在gba_rules文件中>

链接器会根据specs文件配置输出的链接文件,有关specs文件的详细资料可以网上查找,或者往下看specs文件分析

六, 最后一步, objcopy -O binary $< $@ <此命令在gba_rules文件>

嵌入式开发的关键程序,把elf输出成bin文件

七, 小处理生成的bin文件,gbafix <bin>,网上有gbafix源码


有关specs文件分析

gba_mb.specs文件大致内容如下
%rename link                old_link

*link:
-T gba_mb.ld%s %(old_link)

*startfile:
gba_crt0%O%s crti%O%s crtbegin%O%s

*link:
-T 指定脚本,gba_mb.ld,此脚本设置存储器各种分配,字段分配,我并不是很了解LD文件结构,需要了解的查有关资料
*startfile:
引用gba_crt0.s crti.s crtbegin.s文件作为程序开始文件
此命令表示,指定开始文件,(注:所有程序都是从_start开始,然后才到main。你可以objdump -D rom.elf > rom.s,查看有关程序的汇 编)
当然,你也可以在链接命令时添加 ( -nostdlib)而不适用gba_mb.specs配置,不使用标准库文件,但此刻生成的程序以第一个函数为 初始函数

编译过程简化版

1)gcc -c main.c -o main.o
2)gcc -specs=gba_mb.specs main.o  -o main.elf
3)objcopy -O binary main.elf main.gba

此刻已经完成好编译,在附加 gbafix处理ROM文件就OK了
如果运行不了,你可以使用objdump
objdump -D main.elf > main.s

注:GBA文件的头结构,请查有关资料,
第一个指令是 
arm: b    0x080000C0	@跳转指令
或
arm: b    0x020000c0	@跳转指令
如果是其他指令的,一律不执行第二条指令




 类似资料: