Makefile专题:S5PV210裸机的Makefile代码分析【实战】

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专题)