用于RISC-V的Makefile示例

时间:2023-03-10 01:25:07
用于RISC-V的Makefile示例
# Initialize ASM For RISC-V

.section .text.entry
.option norvc
.global _start .macro push_reg
addi sp, sp, -32*4
sw x1, 0 * 4(sp)
sw x2, 1 * 4(sp)
sw x3, 2 * 4(sp)
sw x4, 3 * 4(sp)
sw x5, 4 * 4(sp)
sw x6, 5 * 4(sp)
sw x7, 6 * 4(sp)
sw x8, 7 * 4(sp)
sw x9, 8 * 4(sp)
sw x10, 9 * 4(sp)
sw x11, 10 * 4(sp)
sw x12, 11 * 4(sp)
sw x13, 12 * 4(sp)
sw x14, 13 * 4(sp)
sw x15, 14 * 4(sp)
sw x16, 15 * 4(sp)
sw x17, 16 * 4(sp)
sw x18, 17 * 4(sp)
sw x19, 18 * 4(sp)
sw x20, 19 * 4(sp)
sw x21, 20 * 4(sp)
sw x22, 21 * 4(sp)
sw x23, 22 * 4(sp)
sw x24, 23 * 4(sp)
sw x25, 24 * 4(sp)
sw x26, 25 * 4(sp)
sw x27, 26 * 4(sp)
sw x28, 27 * 4(sp)
sw x29, 28 * 4(sp)
sw x30, 29 * 4(sp)
sw x31, 30 * 4(sp)
csrr t0, mepc
sw t0, 31 * 4(sp)
.endm .macro pop_reg
lw t0, 31 * 4(sp)
csrw mepc, t0
lw x1, 0 * 4(sp)
lw x2, 1 * 4(sp)
lw x3, 2 * 4(sp)
lw x4, 3 * 4(sp)
lw x5, 4 * 4(sp)
lw x6, 5 * 4(sp)
lw x7, 6 * 4(sp)
lw x8, 7 * 4(sp)
lw x9, 8 * 4(sp)
lw x10, 9 * 4(sp)
lw x11, 10 * 4(sp)
lw x12, 11 * 4(sp)
lw x13, 12 * 4(sp)
lw x14, 13 * 4(sp)
lw x15, 14 * 4(sp)
lw x16, 15 * 4(sp)
lw x17, 16 * 4(sp)
lw x18, 17 * 4(sp)
lw x19, 18 * 4(sp)
lw x20, 19 * 4(sp)
lw x21, 20 * 4(sp)
lw x22, 21 * 4(sp)
lw x23, 22 * 4(sp)
lw x24, 23 * 4(sp)
lw x25, 24 * 4(sp)
lw x26, 25 * 4(sp)
lw x27, 26 * 4(sp)
lw x28, 27 * 4(sp)
lw x29, 28 * 4(sp)
lw x30, 29 * 4(sp)
lw x31, 30 * 4(sp)
addi sp, sp, 32*4
.endm .option norvc _start:
j handle_reset trap_vector:
j RVDefaultHandler
j RVDefaultHandler // 1
j RVDefaultHandler // 2
j RVDefaultHandler // 3
j RVDefaultHandler // 4
j RVDefaultHandler // 5
j RVDefaultHandler // 6
j RVDefaultHandler // 7
j RVDefaultHandler // 8
j RVDefaultHandler // 9
j RVDefaultHandler // 10
j RVDefaultHandler // 11
j RVDefaultHandler // 12
j RVDefaultHandler // 13
j RVDefaultHandler // 14
j RVDefaultHandler // 15
j RVDefaultHandler // 16
j RVDefaultHandler // 17
j RVDefaultHandler // 18
j RVDefaultHandler // 19
j RVDefaultHandler // 20
j RVDefaultHandler // 21
j RVDefaultHandler // 22
j RVDefaultHandler // 23
j RVDefaultHandler // 24
j RVDefaultHandler // 25 RVDefaultHandler:
j RVDefaultHandler .section .text
.option norvc handle_reset:
la t0, trap_vector
addi t0, t0, 1
csrw mtvec, t0
csrwi mstatus, 0
csrwi mie, 0
la gp, _gp
la sp, __stack_top # clear bss section
clear_bss:
la t0, __bss_begin
la t1, __bss_end
li t2, 0x00000000 clear_bss_loop:
sw t2, (t0)
addi t0, t0, 4
blt t0, t1, clear_bss_loop jump_to_main:
j main OUTPUT_ARCH("riscv")
ENTRY(_start) MEMORY
{
RAM (rwx) : ORIGIN = 0x0, LENGTH = 8K
} STACK_SIZE = 2k;
HEAP_SIZE = 2k; SECTIONS
{
.text : ALIGN(4)
{
__start_addr = .;
KEEP(*(.text.entry))
. = ALIGN(4);
*(.text*)
. = ALIGN(4);
__text_end = .;
} > RAM .data :
{
__data_load = LOADADDR(.data);
__rodata_start = .;
*(.rodata*)
. = ALIGN(4);
__rodata_end = .;
__data_start = .;
*(.data*)
. = ALIGN(4);
__data_end = .;
} > RAM .sdata :
{
__sdata_load = LOADADDR(.sdata);
__sdata_start = .;
_gp = . + 0x100;
*(.srodata*)
*(.sdata*)
__sdata_end = .;
} > RAM .bss : ALIGN(4)
{
__bss_begin = .; *(.sbss*)
*(.scommon)
*(.bss*)
*(COMMON)
. = ALIGN(4);
__bss_end = .;
} > RAM
_end = .; .stack : ALIGN(4)
{
__stack_bottom = .;
. += STACK_SIZE;
__stack_top = .;
} > RAM .heap : ALIGN(4)
{
__heap_begin = .;
. += HEAP_SIZE;
__heap_end = .;
} > RAM
} #***********************************************************************************************
# File : Makefile
# Author : Lyu Yang
# Date :
# Description : Makefile for RISC-V
#*********************************************************************************************** TARGET = app_test CROSS_COMPILE = riscv64-unknown-elf- SRC_DIR = .
OBJ_DIR = obj
INC_DIR = -I ./
LIB_DIR = -L ./ CC = $(CROSS_COMPILE)gcc
CFLAGS = $(INC_DIR) -c -mabi=ilp32 -march=rv32i -Wall -O1 -std=c99 -gdwarf-2 -freorder-blocks-algorithm=simple -fno-schedule-insns -fno-aggressive-loop-optimizations -fno-builtin -Wstrict-prototypes -Wno-write-strings -fno-exceptions -fno-short-enums -Wundef -falign-functions=2 -fdata-sections -ffunction-sections -fno-common CXX = $(CROSS_COMPILE)g++
CXXFLAGS = $(INC_DIR) -c -mabi=ilp32 -march=rv32i -Wall -O1 -std=c99 -gdwarf-2 -freorder-blocks-algorithm=simple -fno-schedule-insns -fno-aggressive-loop-optimizations -fno-builtin -Wstrict-prototypes -Wno-write-strings -fno-exceptions -fno-short-enums -Wundef -falign-functions=2 -fdata-sections -ffunction-sections -fno-common AS = $(CROSS_COMPILE)gcc
ASFLAGS = -c -mabi=ilp32 -march=rv32i -x assembler-with-cpp -Wall -O1 -gdwarf-2 -fstack-protector -fno-common -fdata-sections -ffunction-sections LD = $(CROSS_COMPILE)gcc
LDFLAGS = $(LIB_DIR) -mabi=ilp32 -march=rv32i -nostartfiles -Triscv.lds -Wl,-Map,$(TARGET).map OBJCP = $(CROSS_COMPILE)objcopy
OBJCPFLAGS = -O binary -j .text -j .data -j .sdata AR = $(CROSS_COMPILE)ar
ARFLAGS = cr OBJDUMP = $(CROSS_COMPILE)objdump
OBJDUMPFLAG = --disassemble --syms --all-header SIZE = $(CROSS_COMPILE)size ASMS = $(wildcard $(SRC_DIR)/*.S)
SRCS = $(wildcard $(SRC_DIR)/*.c) OBJS += $(ASMS:$(SRC_DIR)/%.S=$(OBJ_DIR)/%.o)
OBJS += $(SRCS:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
DEPS += $(OBJS:%.o=%.d) # Make
all: $(TARGET).elf $(TARGET).bin $(TARGET).asm $(TARGET).mif
$(SIZE) $(TARGET).elf $(OBJ_DIR)/%.o: $(SRC_DIR)/%.S
@mkdir -p $(shell dirname $@)
@$(AS) $(ASFLAGS) $< -o $@
@echo AS $< $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
@mkdir -p $(shell dirname $@)
@$(CC) $(CFLAGS) -MM -MT $@ -MF $(patsubst %.o, %.d, $@) $<
@$(CC) $(CFLAGS) $< -o $@
@echo CC $< -include $(DEPS) $(TARGET).elf: $(OBJS)
@$(LD) $(LDFLAGS) $^ -o $@ $(TARGET).asm: $(TARGET).elf
@$(OBJDUMP) $(OBJDUMPFLAG) $(TARGET).elf > $(TARGET).asm $(TARGET).bin: $(TARGET).elf
@$(OBJCP) $(OBJCPFLAGS) $< $@ $(TARGET).mif: $(TARGET).bin
@./bin2fpga/bin2fpga 4096 $< > $(TARGET).txt clean:
@rm -rf obj $(TARGET).elf $(TARGET).map $(TARGET).asm $(TARGET).bin debug:
$(CROSS_COMPILE)gdb $(TARGET).elf -x gdbinit.txt