概述
1、前言
主要分析下学Cortex-A8系列的芯片S5PV210裸机时,一段经常使用的Makefile代码,环境是GCC。
------------------------------------------------------------------------------------------------------------
2、代码分析
01 代码
led.bin: led.o
arm-linux-ld -Ttext 0x0 -o led.elf $^
arm-linux-objcopy -O binary led.elf led.bin # 从elf文件到可烧录镜像bin
arm-linux-objdump -D led.elf > led_elf.dis # objdump作反汇编
gcc mkv210_image.c -o mkx210
./mkx210 led.bin 210.bin
%.o : %.S
arm-linux-gcc -o $@ $< -c
%.o : %.c
arm-linux-gcc -o $@ $< -c
clean:
rm *.o *.elf *.bin *.dis mkx210 -f
02 分析
(1) 生成的目标文件只有一个,是led.bin,其后的led.o是其依赖文件。
(2) arm-linux-ld、arm-linux-objcopy、arm-linux-objdump其实都是交叉编译工具链中的命令,交叉编译的作用是为了实现在虚拟机Linux中编译,在嵌入式单板上工作的目的,这里具体的名字用ln链接过,实际中可以自己更改,关键是要理解这些命令的作用。
(3) arm-linux-ld是交叉链接器,作用是把程序链接成可以在ARM平台下运行,例如:arm-linux-ld -Tled.lds led.o -o led.elf
,就是把led.o链接成led.elf文件,其中led.lds是链接器脚本。
(4) -T选项是ld命令中比较重要的一个选项,可以直接用它指明代码的代码段、数据段、.bss段,对于复杂的连接,可以专门写一个脚本来告诉编译器如何连接,这个命令是加在-ld后面的,常见的有-Ttext addr、-Tdata addr、-Tbss addr、-T*.lds(链接脚本)。
举个例子:arm-linux-ld -Text 0x00000000 -g led_On.o led_On.elf
此时运行地址为0x00000000,由于没有data和bss段,它们会默认的依次放在后面。对于相同的代码,可以连接到不同的text,比较一下有什么差异,ld会自动调整跳转的地址。
(5) $<表示依赖目标中的第一个目标名字,比如这里:
foo.o : foo.c defs.h hack.h
cc -c $(CFLAGS) $< -o $@
# $<指的就是foo.c
(6) 原句分析:arm-linux-ld -Ttext 0x0 -o led.elf $^
这句代码相当于arm-linux-ld -Ttext 0x0 led.o -o led.elf
,就是将led.o链接成led.elf可执行文件,同时此可执行程序的起始地址是0x00000000
(7) arm-linux-objcopy是文件格式转换器,使用其可以把elf格式的文件转换成二进制文件,文件格式转换的原因在于:elf格式的文件不能直接在ARM裸机上运行。(操作系统上才能运行)
(8) 原句分析:arm-linux-objcopy -O binary led.elf led.bin
这句代码就是把led.elf格式的文件转换成led.bin二进制文件。
(9) arm-linux-objdump是交叉反汇编器,使用其可以把可执行文件反汇编后输入保存到目标文件中,例如:arm-linux -objdump -D -S hello >dump
,就是把hello可执行文件反汇编后输入保存到dump文件中,其中-D -S 是反汇编参数,>dump 把hello反汇编后的内容保存到dump文件中。
备注:在编译hello时没有使用-g参数,反汇编后的代码和原来C代码对应不起来。我们可以在编译hello时使用-g参数:先把hello.c文件编译成hello可执行文件:arm-linux-gcc -g hello.c -o hello;运行arm-linux -objdump -D -S hello >dump命令,打开dump文件可以看到。
(10) 原句分析:arm-linux-objdump -D led.elf > led_elf.dis
这句代码就是把可执行文件led.elf反汇编后,保存在led_elf.dis文件中。
(11) 原句分析:
gcc mkv210_image.c -o mkx210
./mkx210 led.bin 210.bin
这一句和交叉编译链没有关系,是GUN下gcc的直接编译链接后得到的结果,这里涉及了一个文件mkv210_image.c,这个文件的作用就是由usb启动的bin文件转化生成sd卡启动的bin文件(16字校验头区别),这个文件之后一定会写文章详细看看的。
(12) $@是目标文件,这里是.o文件,这两句是将所有的.S和.c文件全部编译成.o文件。
-------------------------------------------------------------------------------------------------------------
最后
以上就是仁爱荷花为你收集整理的Makefile专题:S5PV210裸机的Makefile代码分析【实战】的全部内容,希望文章能够帮你解决Makefile专题:S5PV210裸机的Makefile代码分析【实战】所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复