S5PV210通用Makefile文件编写记录
程序员文章站
2022-03-27 21:58:11
S5PV210通用Makefile文件编写记录 最近在学习S5PV210开发相关的知识,因为是入门一切都是新的,目前还是点灯阶段(哈哈哈哈),学习了rocky大佬讲的通用Makefile的编写,感觉真的很好,写下来希望能帮助和我一样的刚入门的小白。 之前也了解了一点点的Makefile文件编写比如说LED灯的Makefile文件编写,一般情况下,我们在LED灯这节会看到Makefile......
S5PV210通用Makefile文件编写记录
最近在学习S5PV210开发相关的知识,因为是入门一切都是新的,
目前还是点灯阶段(哈哈哈哈),学习了rocky大佬讲的通用Makefile的编写
感觉真的很好,写下来希望能帮助和我一样的刚入门的小白。
之前也了解了一点点的Makefile文件编写比如说LED灯的Makefile文件编写
一般情况下,我们在LED灯这节会看到Makefile基本上是这样的:
led_on.bin:led_on.S
arm-linux-gcc -c -o led_on.o led_on.S
arm-linux-ld -Ttext 0x30000000 led_on.o -o led_on.elf
arm-linux-objcopy -O binary -S led_on.elf led_on.bin
clean:
rm -rf *.c *.elf *.bin *.o
但是像这种简单的Makefile会有很多弊端,并不通用,每次更改源文件就需要重
新写编写Makeifile文件,这样就给开发带了很多不便。所以我们需要一种通用的
Makefile文件,通用的Makefile需要支持SD卡启动和uboot下直接运行在RAM上
因此我们就要明白这两种方式下有什么主要的区别:
1)程序运行时的地址不同。DDR:0X20000000、SD卡:0x0;
2)SD卡,需要校验头信息,而RAM不需要加头校验信息。
在这种前提下我们还希望Makefile具有变量集合的概念 。
具体Makile代码如下:
#*.S、*.c -------->*.o---------->BUILD---------->BUILD.bin
#Designed by rocky for S5PV210
#define var #定义变量
TARGET := led.bin #定义最终目标文件(TARGET)名称为led.bin
BUILD := led #*.o文件通过链接后生成BUILD文件此处命名为led
ENV ?= SD #通过ENV变量判断启动方式是从SD卡启动还是从RAM启动
SDTOOLS:= ./mk210 #如果通过SD卡启动就需要借助官方提供的MK210文件进行辅助启动
COBJS +=start.o #最原始文件编译后生成的文件,如果有其他文件可以继续添加此处为start.o
COBJS +=main.o #最原始文件,此处为main.o
CROSS_COMPILE :=arm-linux- #根据不通平台,编译方式不同,此处为arm-linux-交叉编译环境
CC :=$(CROSS_COMPILE)gcc #gcc编译器
LD :=$(CROSS_COMPILE)ld #ld链接器
OBJCOPY:=$(CROSS_COMPILE)objcopy #去文件格式的转换工具
CFLAGS += -Wall #编译时可以去掉注释(打开所有#)
CFLAGS += -I./inc #可以在本层目录寻找相应头文件
LDFLAGS+= -Tmap.lds #链接脚本文件map.lds
ifeq ($(ENV),SD) #如果是通过RAM进行启动
LDFLAGS+= -Ttext=0X0 #地址需要设置为0x0
else #如果通过SD卡启动
LDFLAGS+= -Ttext=0x20000000 #地址设置为0x20000000
endif
#Way
all:$(TARGET) #目标文件为TARGET
ifeq ($(ENV),RAM) #如果通过RAM启动
$(TARGET):$(BUILD)
$(OBJCOPY) -O binary $^ $@ #直接生成目标文件
else #如果通过SD卡进行启动
$(TARGET):$(BUILD)
$(OBJCOPY) -O binary $^ $@.TMP #首先生成临时文件
$(SDTOOLS) $@.TMP $@ #加入官方提供的校验头
endif
$(BUILD):$(COBJS)
$(LD) $(LDFLAGS) -o $@ $^ #链接生成BUILD文件
%.o:%.c
$(CC) $(CFLAGS) -c -o $@ $^ #通过.c生成.o文件
%.o:%.S
$(CC) $(CFLAGS) -c -o $@ $^ #通过.S生成.o文件
clean: #清除
rm -f $(TARGET) $(BUILD) *.o *.TMP
其中map.lds文件为链接脚本文件,其的作用为
1) 哪一个.o放到代码段的起始位置
2) 所有的.o放到哪个基地址上
3) 代码段、数据段等等是不连续的需要分别指定地址。
代码如下:
OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. =0x0; #声明起始地址这里设置为0,即在此处不起作用
#因为Makefile中已经指定了地址
. =ALIGN(4); #四字节对齐
.text : #代码段
{
start.o
*(.text)
}
. =ALIGN(4);
.rodata : #只读数据段
{
*(.rodata)
}
. =ALIGN(4);
.data : #初始化数据段
{
*(.data)
}
:. =ALIGN(4);
.bss :
{
*(.bss) #未初始化数据段
}
}
以上文件仅供参考学习交流,如有错误,还请指正,侵删。
本文地址:https://blog.csdn.net/chuomei5332/article/details/85987103