以下内容是Makefile文件内容。
#指定使用的是哪个链接脚本
LED_LDS = -Tled.lds
ledc.bin:start.S ledc.c
arm-none-linux-gnuebi-gcc -c -o start.o start.S # 生成目录文件
arm-none-linux-gnuebi-gcc -c -o ledc.o ledc.c # 生成目录文件
#使用链接脚本将目标文件链接成ELF可执行文件。若不使用链接脚本时,连接顺序为目录文件书写的顺序
#-Ttext 0x40008000 指定.text段的起始地址
arm-none-linux-gnuebi-ld $(LED_LDS) -Ttext 0x40008000 ledc.o start.o -o ledc_elf
#使用objcopy将ELF文件的头部信息去除,然后生成ledc.bin二进制文件
arm-none-linux-gnuebi-objcopy -O binary -S ledc_elf ledc.bin
#使用objdump将LEF文件ledc_elf进行反汇编,生成反汇编文件ledc.dis
arm-none-linux-gnuebi-objdump -D ledc_elf > ledc.dis
clean:
rm -f *.o *.dis ledc_elf *.bin
以下内容是链接脚本的内容。
OUTPUT_ARCH(arm) #输出格式为ARM架构
ENTRY(_start) #指定首先执行的函数的入口地址
SECTIONS #目录文件各个段的排布情况
{
. = 0x40008000; #指定.text段的起始地址
.tex :
{
start.o (.text)
ledc.o (.text)
* (.text)
}
.rodata :
{
* (.rodata)
}
.data : #已经初始化的全局变量
{
* (.data)
}
.bss : #程序中未初始化的全局变量,在系统启动时全部清0
{
__bss_start = . ; #定义一个全局符号,保存.bss的启始地址
* (.bss)
__bss_end = . ; #定义一个全局符号,保存.bss段的结束地址,
#__bss_start ,__bss_end 用于在系统启时指定要清0的地址区域
}
}