以下内容 参考 https://blog.youkuaiyun.com/haoel/article/details/2886/
大致规则:
目标(target) ... : 依赖(prerequisites) ...
命令(command)
...
...
其中,target也就是一个目标文件,可以是Object File,也可以是执行文件。prerequisites就是,要生成那个target所需要的文件或是目标。command也就是make需要执行的命令。
下面举几个韦老师书上的例子:
对于 arm-linux-gcc arm-linux-ld arm-linux-objcopy arm-linux-objdump的用法 可以参考https://blog.youkuaiyun.com/muyuyuzhong/article/details/7755291
led 的例子:
led.bin : led.c led.S
arm-linux-gcc -c -o ledc.o led.c ( -c 只编译,不连接)
arm-linux-gcc -c -o leds.o led.S
arm-linux-ld -Ttext 0X00000000 ledc.o leds.o -o led_elf
arm-linux-objcopy -O binary -S led_elf led.bin
Clean:
rm -f led.bin led_elf *.o
( arm-linux-objcopy 被用来复制一个目标文件的内容到另一个文件中.此选项可以进行格式的转换;
在实际编程的,用的最多的就是,将ELF格式的可执行文件转换为二进制文件.
如: arm-linux-objcopy –O binary –S elf_file bin_file ,其中 -O 后面加 输出的格式;
-S 表示不从源文件中复制重定位信息和符号信息到目标文件中 )
SDRAM 的例子:
SDRAM.bin : led.c SDRAM.S
arm-linux-gcc -c -o ledc.o led.c
arm-linux-gcc -c -o SDRAM.o SDRAM.S
arm-linux-ld -Ttext 0X30000000 ledc.o SDRAM.o -o SDRAM_elf
arm-linux-objcopy -0 binary -S SDRAM_elf SDRAM.bin
Clean :
rm -f SDRAM.bin SDRAM.elf *.o
MMU 的例子
objs := head.o init.o leds.o( Makefile文件里的赋值方法有两种:延时变量、立即变量,前者在真正使用时变量的值才确实,后者在定义时就已经确定了;使用"=" "?=" "define"定义是延时变量,使用":="定义的变量是立即变量,这里定义objs 是立即变量 )
mmu.bin :$(objs) (这里相当于 mmu.bin : head.o init.o leds.o)
arm-linux-ld -Tmmu.lds -o mmu_linux $^ ($@ 表示规则的目标文件名; $^表示所有依赖的名字;$< 表示第一个依赖的文件名)
arm-linux-objcopy -O binary -S mmu_linux $@
arm-linux-objdump -D -m arm mmu_linux > mmu.dis (这里参考https://zhidao.baidu.com/question/484741109.html,目的是将反汇编程序写到mmu.dis文件中去,不从终端输出)
%.o:%.c
arm-linux-gcc -Wall -O2 -c -o $@ $<
%.o:%.S
arm-linux-gcc -Wall -O2 -c -o $@ $<
Clean :
rm -f mmu.bin mmu_linux mmu.dis *.o