第一个程序,驱动LED灯亮。包含4个文件:Makefile,make命令批处理文件。write2sd是一个脚本文件。start.s汇编文件,驱动开发板亮灯的逻辑实现。mkv210_image.c文件,它的的作用就是用来给原始的bin文件添加头部。
Makefile(听说linux区分大小写,所以首M还是大写的好)
代码:
led.bin: start.o
arm-linux-ld -Ttext 0x0 -o led.elf $^
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led_elf.dis
gcc mkv210_image.c -o mkmini210 ./mkmini210 led.bin 210.bin
%.o : %.S
arm-linux-gcc -o $@ $< -c
%.o : %.c
arm-linux-gcc -o $@ $< -c
clean:
rm *.o *.elf *.bin *.dis mkmini210 -f
其中
“$@”可代表目标文件的完整名称
“$<”可代表第一个文件的依赖文件的名称
“$^"可代表所有不重复的依赖文件
.o文件:目标文件
.s/.S文件:汇编语言原始程序
.h文件:预处理文件(头文件)
.c:c原始程序文件
.cc/.C/.cxx:c++原始程序文件
.m:Objective.c原始程序文件
.i:已经预处理过的c原始程序
.ii:已经预处理过额c++原始程序文件
.a/.so:编译后的库文件
%.o(要生成的文件) : %.S(依赖文件)
arm-linux-gcc -o $@ $< -c(操作)
表示对所有的".S"汇编文件编译成“.o”文件。“-c”(compile)参数进行预处理、编译、汇编操作 , "-o" 参数用于指定输出的文件,后面紧接着的就是文件名
%.o : %.c
arm-linux-gcc -o $@ $< -c
表示对所有的".c"汇编文件编译成“.o”文件。
arm-linux-ld -Ttext 0x0 -o led.elf $^
arm-linux-ld 连接命令,这里表示将“所有不重复的依赖文件”连接成led.elf这个文件,此可执行文件的代码段的起始地址为0x00000000(从此处开始执行)“-Ttext 0x0”设置代码段的起始地址为0x00000000;
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objcopy 复制一个目标文件的内容到另一个文件中,可以用于不同格式文件之间的格式转换
参数:
.-l bfdname(格式名)或—input-target=bfdname
用来指明源文件的格式,bfdname是BFD库中描述的标准格式名,如果没指明,则arm-linux-objcopy自己分析
-O bfdname 输出的格式(binary二进制)
-F bfdname 同时指明源文件,目的文件的格式
-R sectionname 从输出文件中删除掉所有名为sectionname的段
-S 不从源文件中复制重定位信息和符号信息到目标文件中
-g 不从源文件中复制调试符号到目标文件中
arm-linux-objdump -D led.elf > led_elf.dis
常用来显示二进制文件信息,和查看反汇编代码。
'>' 表示将这个程序的反汇编程序写入到led_elf.dis这个文件中,在终端中不显示出来. 当你打开led_elf.dis这个文件时就会看到上面命令的输出的反汇编程序了。 至于led_elf.dis是什么文件,我也不知道,网上也没有详细的讲解
<span class="m"></span>“./” 表示当前路径 linux下 “.” 是当前目录 “ ..” 是父目录
参数: