如何使用 LLVM/Clang 编译为 RISC-V 目标?

2023-11-21

我想将一个简单的程序“int main(){return 0;}”编译到RISC-V处理器。 LLVM/Clang 版本是 9.0,我想用这样的 RISC-V 模拟器运行编译后的程序https://github.com/riscv/riscv-tools

我的问题是我无法列出 clang 支持的目标,只能列出具有以下命令的 LLC-s:

llc --version
llc -march=xxARCHTYPExx -mattr=help

并且没有列出任何类型的 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

另外,我可以使用 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

虽然它不包含 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.

但是,您实际上并不需要 - 您可以直接为您的 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

我不使用 clang 进行链接,因为似乎我无法说服 clang-fuse-ld除此之外使用另一个链接器/usr/bin/ld.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 LLVM/Clang 编译为 RISC-V 目标? 的相关文章

  • 将 dll 注册到 GAC 或从 ASP.NET 中的 bin 文件夹引用它们是否更好

    如果答案是 视情况而定 您能否提供一个简短的解释 GAC 旨在包含以下组件跨多个应用程序共享 如果是这种情况 您应该对程序集进行强命名并向 GAC 注册 如果不是 请将程序集保留为私有程序集并将其作为项目 dll 引用进行引用 PS 没有真
  • Clang:使用取决于模板上下文的 constexpr 模板变量对二进制表达式(“const auto”和“int”)无效操作数

    Clang error invalid operands to binary expression const auto and int 语境 铿锵12 0 0 简单的问题 此错误在此上下文中意味着什么 例如 该消息与此处相关吗 为什么这个
  • 有没有办法在输出二进制文件中存储 clang 编译时标志?

    使用 clang 时 有没有办法在输出二进制文件中存储编译时标志 例如运行后 clang O3 c main c 所结果的main o文件应该包含在某处 O3 gcc has frecord gcc switches https stack
  • gcc 与 clang:符号剥离

    gcc 和 AMD Open64 opencc 都有一个 s选项 剥离符号表和重定位信息 到目前为止我还没能在 Clang LLVM 中找到相同的选项 它存在吗 您可以使用stripbinutils 中的实用程序 实际上 llvm ld 有
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • 如何从 LLVM 指令获取文件名和目录?

    我需要在 llvm 过程中提取目录和文件名 当前版本的 llvm 已移动getFilename and getDirectory from DebugLoc to DebugInfoMetadata 我找不到班级成员getFilename直
  • 如何使用 Clang 查找内存泄漏

    我在我的机器 ubuntu 中安装了 Clang 以便发现我的 C 代码中的内存泄漏 我编写了一个示例代码来检查它的工作情况 如下所示 File hello c for leak detection include
  • 在 OS X 上与 clang++ 链接会生成大量符号未找到错误

    我正在尝试使用 clang 编译器在 OS X 10 8 上编译一些 C 代码 包括 C 11 功能 我有一个生成目标文件的 makefile OK 然后在命令上 clang o Analysis so shared DataFile o
  • clang C++11 调用

    虽然这里有一些关于 clang 的 C 11 支持的问题 但我似乎无法得到clang 吃掉我的 C 11 代码 clang version clang version 2 9 tags RELEASE 29 final Target x86
  • clang:发射是什么意思?

    The clang 诊断参考 https clang llvm org docs DiagnosticsReference html使用这个词emit三次 以下警告使用该术语 实施例1 https godbolt org z aa3svfY
  • C++ 标准是否允许未初始化的 bool 导致程序崩溃?

    我知道一个 未定义的行为 C 几乎可以让编译器做任何它想做的事情 然而 我遇到了一次令我惊讶的崩溃 因为我认为代码足够安全 在这种情况下 真正的问题仅发生在使用特定编译器的特定平台上 并且仅在启用优化的情况下发生 我尝试了几种方法来重现问题
  • 使用 _POSIX_C_SOURCE 2 的 Clang 未知类型名称“siginfo_t”,为什么?

    Update结果我的讲师会接受按照 GNU99 标准编写的代码 因此 正如 User1 指出的那样 我使用了 GNU SOURCE在我的节目开始时 看man feature test macros了解更多信息 感谢您帮助我理解 在带有 Cl
  • Clang 中所有 Objective-C 预处理器指令的列表

    Clang 中是否有所有 Objective C 预处理器指令的列表 我说的是 pragma mark Section I or pragma unused variableName or warning message 我想了解更多信息以
  • “%d”需要“int”类型的参数,但参数 2 的类型为“long unsigned int”[-Wformat=] [重复]

    这个问题在这里已经有答案了 我不断收到编译警告 但我不知道如何解决它 d expects argument of type int but argument 2 has type long unsigned int 程序运行良好 但我仍然收
  • Objective-C 头解析

    我需要解析一些 Objective C 标头 我尝试过使用Doxygen并解析 XML 输出 但它不完全支持没有注释的 Objective C 标头 它会阻塞属性中定义的宏 请检查Doxygen 无法正确识别属性 https stackov
  • 如何在 Clang 中检测 libstdc++ 版本?

    我想用 Clang 编写一个 可移植 C 库 可移植 意味着我 在 C 预处理器中 检测编译环境中可用的 C 功能 并使用这些功能或提供我的解决方法 这与 Boost 库所做的类似 然而 某些功能的存在并不取决于语言 而是取决于标准库的实现
  • 从命令行编译 VB6

    有人知道如何从命令行编译 vb6 webclass dll 吗 我正在尝试构建一个用于自动版本构建的工具 但它失败并显示 文件 文件名 中的编译错误 第 xxxx 行 变量未定义 警报 已知错误 http support microsoft
  • 为什么这个函数在额外读取内存时运行速度如此之快?

    我目前正在尝试了解 x86 64 上某些循环的性能属性 特别是我的 Intel R Core TM i3 8145U CPU 2 10GHz 处理器 具体来说 在循环体内添加一条额外的指令来读取内存几乎可以使性能提高一倍 而细节并不是特别重
  • Clang++ -fmodules 在 #include 之后使用类型时出错

    下面的简单测试用例文件在编译时给我一个编译时错误 提示来自 Clang 的 github 镜像的 master fmodules 使用如下所示的命令 我想知道这是否是 Clang 的新实验性模块功能的一个错误 可能是标准库模块映射实现的问题
  • Maven编译错误:包不存在

    我正在尝试向现有企业项目添加 Maven 支持 这是一个多模块项目 前 2 个模块编译和打包没有问题 但我面临编译错误 我尝试在多个模块中使用相同的依赖项 我的结构是 gt parent gt pom xml gt module 1 gt

随机推荐