-
Notifications
You must be signed in to change notification settings - Fork 35
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.