欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

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

相关标签: Linux开发