【发布时间】:2019-03-09 17:21:12
【问题描述】:
我正在尝试使用 llvm/clang 在 winx64 机器上将一个非常简单的 Hello World C 程序编译为 MIPS 程序集。
我已经搜索过这个问题,虽然有许多主题相似的主题,但它们几乎完全使用 linux,而且往往不提供任何形式的解决方案。
我的印象是,如果我获得最新的 LLVM 二进制文件并将其安装在我的 Windows 机器上,我将能够直接交叉编译 C 到 MIPS 程序集。 不是这样还是我错过了什么?
如果我针对 Windows 以外的任何对象,我会收到缺少头文件 stdio.h 的错误 设计的东西不正是为了做到这一点吗?将我的 C 代码转换为给定的目标 asm?
Windows 上似乎没有 Config.h,就像 linux 上一样,可以更改某些硬编码路径。
也许我完全误解了关于 llvm/clang 的一些东西。 希望任何人都可以帮助我指出解决这个问题的方向。
谢谢
【问题讨论】:
-
“我收到一个关于缺少头文件 stdio.h 的错误,这难道不是设计来做到这一点的吗?将我的 C 代码转换为给定的目标 asm 吗?” - 但如果你包含 stdio.h 那么你要求它做的不止这些:你要求它针对一个它找不到的 C 运行时库进行构建。我比 LLVM 更了解 GCC,但对于 GCC,您需要从目标系统中为其提供头文件和库,例如从 MIPS Linux 发行版中复制它们。 (而且它首先需要有这些来构建编译器。)但是 LLVM 可能不同。你将在哪里运行这个二进制文件?
-
LLVM 可以处理许多不同种类的交叉编译,但二进制文件并不是用所有这些来构建的。如果要交叉编译,通常必须从源代码构建。 (而且,正如@Rup 所说,您已经为目标而不是主机系统提供了头文件等。)
-
感谢您的输入,现在图片更清晰了。我不是在尝试构建二进制文件,只是在模拟 mips 处理器上运行 mips 程序集。我将从 MIPS 中查找头文件并尝试将它们作为包含目录传递。
-
clang on Godbolt 适用于许多随机架构,例如
-target sparc64或-target mips,就像我在 What exact rules in the C++ memory model prevent reordering before acquire operations? 上的回答中的 Godbolt 链接一样。 godbolt.org/z/zT2rkp。有时你会遇到头文件问题,但对于某些东西,如果你只是想看看编译器如何在 MIPS 或任何其他 ISA 上做某事,它会非常有用。
标签: c assembly llvm mips llvm-clang