Zol*_*tán 6 compilation llvm clang riscv
我想为 RISC-V 处理器编译一个简单的程序“int main(){return 0;}”。LLVM/Clang 版本是 9.0,我想用这样的 RISC-V 模拟器运行编译的程序https://github.com/riscv/riscv-tools
我的问题是,我无法仅列出带有这些命令的 LLC-s 支持的 clang 目标:
llc --version
llc -march=xxARCHTYPExx -mattr=help
Run Code Online (Sandbox Code Playgroud)
并且没有列出任何类型的 riscv 处理器。
所以我试图查看三重文件: llvm-project\llvm\include\llvm\ADT\Triple.h
并尝试以下命令: clang hello.c -target riscv32 -march=rv32imafd
但我收到以下错误:
错误:无法创建目标:'没有可用的目标与三重“riscv32”兼容'
有人可以帮助我如何获得有效的 RISC-V 目标吗?我只是简单的无法编译程序,但我知道 LLVM 有 RISC-V 支持。
LLVM 9发行说明明确指出 RISC-V 支持已从实验性提升为正式版。
事实上,在我的 Fedora 31 机器上,LLVM 9 Fedora 软件包确实支持 RISC-V:
$ llvm-objdump --version | grep riscv
riscv32 - 32-bit RISC-V
riscv64 - 64-bit RISC-V
Run Code Online (Sandbox Code Playgroud)
此外,我可以使用 LLVM 工具链创建 RISC-V 二进制代码:
$ clang --target=riscv64 -march=rv64gc rotate.s -c -o rotate.o
$ file rotate.o
rotate.o: ELF 64-bit LSB relocatable, UCB RISC-V, version 1 (SYSV), not stripped
Run Code Online (Sandbox Code Playgroud)
虽然它不包括用于 RISC-V 目标的 libc:
$ clang --target=riscv64 -march=rv64gc hello-world.c -o hello-world
hello-world.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
^~~~~~~~~
1 error generated.
Run Code Online (Sandbox Code Playgroud)
但是,您实际上并不需要 - 您可以直接为您的 hello world 调用系统调用,例如:
$ clang --target=riscv64 -march=rv64gc hello.s -c -o hello.o
$ ld.lld hello.o -o hello
$ spike --isa=RV64gc ~/local/riscv/pk/riscv64-unknown-elf/bin/pk ./hello
bbl loader
Hello World
Run Code Online (Sandbox Code Playgroud)
我不使用 clang 进行链接,因为我似乎无法说服 clang-fuse-ld使用除/usr/bin/ld.