当前位置: 移动技术网 > 科技>办公>配件 > S5PV210通用Makefile文件编写记录

S5PV210通用Makefile文件编写记录

2020年07月29日  | 移动技术网科技  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网