用于OpenRISC的Makefile示例

时间:2022-06-02 19:47:45
#*
#
***********************************************************************************************
# Function : Makefile
# Parameter : all
# Author : Lyu Yang
# Date :
# Description : Makefile
for OR1200(altor32)
#
***********************************************************************************************
#
*

PROJECT
= main

CROSS_COMPILE
= or32-elf-

INCLUDE_DIRS
= -I ./

LIBRARY_DIRS
= -L ./


CC
= $(CROSS_COMPILE)gcc
CFLAGS
= $(INCLUDE_DIRS) -c -msoft-div -msoft-float -msoft-mul -mno-ror -mno-cmov -mno-sext -Os

CXX
= $(CROSS_COMPILE)g++
CXXFLAGS
= $(INCLUDE_DIRS) -c -msoft-div -msoft-float -msoft-mul -mno-ror -mno-cmov -mno-sext -Os

AS
= $(CROSS_COMPILE)gcc
ASFLAGS
= $(INCLUDE_DIRS) -c -msoft-div -msoft-float -msoft-mul -mno-ror -mno-cmov -mno-sext -Os

LD
= $(CROSS_COMPILE)ld
LDFLAGS
= $(LIBRARY_DIRS) -T./or1200.lds -Map $(PROJECT).map -nostartfiles -nodefaultlibs -nostdlib

OBJCP
= $(CROSS_COMPILE)objcopy
OBJCPFLAGS
= -O binary -j .boot -j .vectors -j .text -j .rodata -j .data -j .bss

AR
= $(CROSS_COMPILE)ar
ARFLAGS
= cr

DUMP
= $(CROSS_COMPILE)objdump
DUMPFLAG
= --disassemble --syms --all-header

SIZE
= $(CROSS_COMPILE)size

# Static library files
OBJS_LIB
+=

# User should list all
object files
OBJS
= ./Crt0.o
OBJS
+= ./main.o


# Make
.PHONY: all clean debug
all: $(PROJECT).elf $(PROJECT).bin $(PROJECT).asm $(PROJECT).mif
$(SIZE) $(PROJECT).elf

Crt0.o: Crt0.S
$(AS) $(ASFLAGS) $
^ -o $@
main.o: main.c
$(CC) $(CFLAGS) $
^ -o $@

$(PROJECT).elf: $(OBJS)
$(LD) $(LDFLAGS) $(OBJS_LIB)
-o $@ $^

$(PROJECT).asm: $(PROJECT).elf
$(DUMP) $(DUMPFLAG) $(PROJECT).elf
> $(PROJECT).asm

$(PROJECT).bin: $(PROJECT).elf
$(OBJCP) $(OBJCPFLAGS) $
< $@

$(PROJECT).mif: $(PROJECT).bin
.
/bin2fpga/bin2fpga 4096 $<

clean:
rm -rf *.o *.asm *.elf *.bin *.mif *.map *.coe data.txt

debug:
$(CROSS_COMPILE)gdb $(PROJECT).elf
-x gdbinit.txt

    上面的Makefile用于开源处理器OpenRISC精简版AltOR32的软件开发。使用的工具链为or32-elf-gcc。连接脚本为:

/* Linker script for OR1200 */

OUTPUT_FORMAT("elf32-or32")
OUTPUT_ARCH(or32)
ENTRY(_reset)

MEMORY
{
  OR1200_RAM (rwx) : ORIGIN = 0x0, LENGTH = 0x4000
  DRAM (rwx) : ORIGIN = 0x10000000, LENGTH = 0x10000000
}


SECTIONS
{
  .text :
  {
    _stext = .;
    stext = .;
    *(.text)
    *(.text.*)
    . = ALIGN(4);
    _etext = .;
    etext = .;
  } > OR1200_RAM

  .rodata :
  {
    _sdata = .;
    sdata = .;
    . = ALIGN(4);
    *(.rodata)
    *(.rodata.*)
  } > OR1200_RAM

  .data :
  {
    *(.sdata)
    *(.data)
    *(.rwdata)
    *(.got.plt) *(.got)
    *(.shdata)
    *(.data.* .gnu.linkonce.d.*)
    . = ALIGN (4);
    _edata = .;
    edata = .;
  } > OR1200_RAM

  .bss :
  {
  . = ALIGN(4);
    __bss_start = .;
    *(.sbss .sbss.*)
    *(.bss .bss.*)
    *(COMMON)
    . = ALIGN (4);
    __bss_end = .;
  } > OR1200_RAM
}

/* Stack base address */
__stack_pointer = 0x4000;