Directorio de artículos
1. Descripción
Este artículo fue adaptado del siguiente artículo:
- Configuración del entorno RISC-V
https://decaf-lang.github.io/minidecaf-tutorial/docs/step0/riscv_env.html
Enlaces relacionados:
- riscv-gnu-toolchain
Cadena de herramientas GNU para RISC-V, incluido GCC
https://github.com/riscv/riscv-gnu-toolchain - brew - Compiladores-GCC-y-cross-personalizados
https://docs.brew.sh/Custom-GCC-and-cross-compilers - riscv-isa-sim
Spike, un simulador RISC-V ISA
https://github.com/riscv-software-src/riscv-isa-sim - riscv-pk
Núcleo proxy RISC-V
https://github.com/riscv-software-src/riscv-pk
2. Pasos de instalación
1. Utilice Brew para instalar dependencias relacionadas.
brew install dtc gawk gnu-sed gmp mpfr libmpc isl zlib expat texinfo flock
brew tap riscv/riscv
brew install riscv-tools
brew install riscv-isa-sim
brew install qemu
El paquete instalado por Brew generalmente se encuentra /usr/local/Cellar
en :
2. Descargue la cadena de herramientas RISC-V precompilada
riscv64-unknown-elf-gcc-8.3.0-2020.04.0-x86_64-apple-darwin.tar.gz
https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-8.3.0-2020.04.0-x86_64-apple-darwin.tar.gz
Después de la descompresión, agregue el directorio bin a la variable de entorno
Puede obtener los siguientes archivos ejecutables, etc.:
riscv64-desconocido-elf-addr2line
- riscv64-elfo-desconocido-gcc-ar
- riscv64-elfo-desconocido-ld.bfd
- riscv64-elfo-desconocido-ar
- riscv64-elfo-desconocido-gcc-nm
- riscv64-elfo-desconocido-nm
- riscv64-elfo-desconocido
- riscv64-elf-desconocido-gcc-ranlib
- riscv64-objcopy-elfo-desconocido
- riscv64-elfo-desconocido-c++
- riscv64-elfo-desconocido-gcov
- riscv64-objdump-elfo-desconocido
- riscv64-elf-desconocido-c++filt
- riscv64-desconocido-elf-gcov-volcado
- riscv64-desconocido-elf-ranlib
- riscv64-elf-cpp-desconocido
- riscv64-desconocido-elf-gcov-herramienta
- riscv64-elf-desconocido-readelf
- riscv64-elfo-desconocido-elfedit
- riscv64-elf-desconocido-gdb
- riscv64-tamaño-elfo-desconocido
- riscv64-elfo-desconocido-g++
- riscv64-desconocido-elf-gdb-agregar-índice
- riscv64-cadenas-elfos-desconocidas
- riscv64-elfo-desconocido-gcc
- riscv64-elfo-desconocido-gprof
- riscv64-tira-elfo-desconocida
- riscv64-elfo-desconocido-gcc-8.3.0
- riscv64-elfo-desconocido-ld
3. Descargue el paquete binario precompilado de Spike.
spike-pk-prebuilt-x86_64-apple-darwin.tar.gz
https://cloud.tsinghua.edu.cn/f/6246e90c407b4a508816/
Después de la descompresión, cree un enlace suave pk
ln xxx/software/spike-pk-prebuilt-x86_64-apple-darwin/pk /usr/local/bin/pk
De lo contrario, el programa de ejecución puede informar un error:
libc++abi: terminando debido a una excepción no detectada de tipo std::runtime_error: no se pudo abrir /usr/local/bin/pk (¿lo escribiste mal? Si es VCS, ¿olvidaste +permisivo/+permisivo-off?)
3. Prueba
Realizar las siguientes funciones:
- Generar ensamblaje RISC-V
- Utilice gcc para convertir el ensamblaje RISC-V en ejecutable RISC-V
- Ejecute el ejecutable RISC-V con Spike.
你的编译器 gcc qemu/spike
MiniDecaf 源文件 ------------> RISC-V 汇编 -----> 可执行文件 --------> 输出
1. Escribe el archivoinput.c
int main(){
return 233;}
2. Compile en input.s
riscv64-unknown-elf-gcc -march=rv32im -mabi=ilp32 -O3 -S input.c
get cat input.s
, puedes ver su contenido
cat input.s
conseguir:
.file "input.c"
.option nopic
.attribute arch, "rv32i2p1_m2p0"
.attribute unaligned_access, 0
.attribute stack_align, 16
.text
.section .text.startup,"ax",@progbits
.align 2
.globl main
.type main, @function
main:
li a0,122
ret
.size main, .-main
.ident "GCC: (g2ee5e430018-dirty) 12.2.0"
3. Compile en un archivo ejecutable.
riscv64-unknown-elf-gcc -march=rv32im -mabi=ilp32 input.s
generar a.out
archivo
También puedes saltar -s
directamente para generar el archivo ejecutable.
riscv64-unknown-elf-gcc -march=rv32im -mabi=ilp32 -O3 test.c
Ver a.out
propiedades del archivo
file a.out
conseguir:
a.out: ejecutable ELF LSB de 32 bits, UCB RISC-V, ABI de flotación suave, versión 1 (SYSV), vinculado estáticamente, no eliminado
4. Ejecucióna.out
spike --isa=RV32G /usr/local/bin/pk a.out
imprimir
bbl loader
Continúe
imprimiendo $?
, este es el código de retorno de Spike, que es el valor devuelto por el método principal de nuestro archivo .c.
echo $?
Iori 2023-08-21