Skip to content

RISC V toolchain

Viktor Prutyanov edited this page Jan 5, 2025 · 16 revisions

Установка

Fedora

sudo yum install binutils-riscv64-linux-gnu
sudo yum install gcc-riscv64-linux-gnu

Ubuntu

sudo apt install binutils-riscv64-linux-gnu
sudo apt install gcc-riscv64-linux-gnu

Cборка программ на ассемблере RISC-V

Для примера возьмём следующую программу на ассемблере:

.text
.globl _start
.globl _finish

_start:
    li    x5, 11
    addi  x7, x5,  9
    nop
    mv   x11, x7

_finish:
    nop

Будем предполагать, что она сохранена в файле addi.s. Теперь для сборки программы под RV32I нужно выполнить следующие действия:

  1. Создать объектный файл addi.o.
riscv64-linux-gnu-as -march=rv32i -mabi=ilp32 -c addi.s -o addi.o
  1. Создать исполняемый ELF-файл addi.out.
riscv64-linux-gnu-ld -melf32lriscv addi.o -o addi.out

Файл addi.out можно запускать в симуляторе RISC-V.

  1. Скопировать секцию кода в файл addi.bin.
riscv64-linux-gnu-objcopy -O binary addi.out addi.bin
  1. Превратить двоичный код в его текстовое представление addi.txt.
hexdump -v -e '"%08x\n"' addi.bin > addi.txt

Файл addi.txt можно использовать в директиве $readmemh.

Все 4 стадии можно объединить в один Makefile:

RISCV_PREFIX=riscv64-linux-gnu-

AS=$(RISCV_PREFIX)as
LD=$(RISCV_PREFIX)ld
OBJCOPY=$(RISCV_PREFIX)objcopy
OBJDUMP=$(RISCV_PREFIX)objdump

SRCS=$(wildcard *.s)
TXTS=$(SRCS:%.s=%.txt)

all: $(TXTS)

%.txt: %.bin
    hexdump -v -e '"%08x\n"' $^ > $@

%.bin: %.out
    $(OBJCOPY) -O binary $^ $@

%.out: %.o
    $(LD) -melf32lriscv $^ -o $@ && $(OBJDUMP) -d $@

%.o: %.s
    $(AS) -march=rv32i -mabi=ilp32 -c $^ -o $@

.PHONY: all clean

.PRECIOUS: %.o %.out %.bin

clean:
    rm -f *.o *.out *.bin *.txt

Тогда собрать addi.txt можно так:

$ make addi.txt
riscv64-linux-gnu-as -march=rv32i -mabi=ilp32 -c addi.s -o addi.o
riscv64-linux-gnu-ld -melf32lriscv addi.o -o addi.out && riscv64-linux-gnu-objdump -d addi.out

addi.out:     file format elf32-littleriscv


Disassembly of section .text:

00010054 <_start>:
   10054:	00b00293          	li	t0,11
   10058:	00928393          	addi	t2,t0,9
   1005c:	00000013          	nop
   10060:	00038593          	mv	a1,t2

00010064 <_finish>:
   10064:	00000013          	nop
riscv64-linux-gnu-objcopy -O binary addi.out addi.bin
hexdump -v -e '"%08x\n"' addi.bin > addi.txt

Или просто запустить make, чтобы для каждого файла .s создать соответствующий .txt.