-
Notifications
You must be signed in to change notification settings - Fork 28
RISC V toolchain
Viktor Prutyanov edited this page Jan 5, 2025
·
16 revisions
sudo yum install binutils-riscv64-linux-gnu
sudo yum install gcc-riscv64-linux-gnu
sudo apt install binutils-riscv64-linux-gnu
sudo apt install gcc-riscv64-linux-gnu
Для примера возьмём следующую программу на ассемблере:
.text
.globl _start
.globl _finish
_start:
li x5, 11
addi x7, x5, 9
nop
mv x11, x7
_finish:
nop
Будем предполагать, что она сохранена в файле addi.s
. Теперь для сборки программы под RV32I нужно выполнить следующие действия:
- Создать объектный файл
addi.o
.
riscv64-linux-gnu-as -march=rv32i -mabi=ilp32 -c addi.s -o addi.o
- Создать исполняемый ELF-файл
addi.out
.
riscv64-linux-gnu-ld -melf32lriscv addi.o -o addi.out
Файл addi.out
можно запускать в симуляторе RISC-V.
- Скопировать секцию кода в файл
addi.bin
.
riscv64-linux-gnu-objcopy -O binary addi.out addi.bin
- Превратить двоичный код в его текстовое представление
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
.