7

所以情况是这样的:我需要能够从能够从 SPARC 服务器运行的 Linux 机器(在 Ubuntu 上,为了它的价值)编译二进制文件。我要编译的程序非常简单:

#include <stdio.h>
#include <stdlib.h>

int main() {
    printf("Testing the SPARC program...");
    return EXIT_SUCCESS;
}

我尝试了许多不同的编译行来让它工作,但不幸的是似乎没有任何工作。

我尝试了传统的:

 clang -target sparc blah.c -o blahsparc

但这不起作用,有一堆汇编程序失败:

 /tmp/blah-519e77.s: Assembler messages:
 /tmp/blah-519e77.s:7: Error: unknown pseudo-op: '.register'
 /tmp/blah-519e77.s:8: Error: unknown pseudo-op: '.register'
 /tmp/blah-519e77.s:9: Error: unknown pseudo-op: '.register'
 /tmp/blah-519e77.s:10: Error: unknown pseudo-op: '.register'
 /tmp/blah-519e77.s:11: Error: no such instruction: 'save %sp,-240,%sp'
 /tmp/blah-519e77.s:12: Error: no such instruction: 'st %g0, [%fp+2043]'
 ...
 clang: error: assembler (via gcc) command failed with exit code 1 (use -v to see invocation)

我也试过这个:

clang -cc1 -triple "sparc-unknown-Linux" blah.c -o blahsparc

它抱怨缺少标题,所以我不使用-cc1,而是使用-Xclang:

clang -Xclang -triple -Xclang "sparc-unknown-Linux" blah.c -o blahsparc

但是,这也由于“错误:未知目标 CPU 'x86-64'”而失败。我不确定从哪里着手。我也尝试过使用 crosstool-ng,但收效甚微。

4

3 回答 3

4

从 3.4.2 版本(2014 年 6 月)开始,llvm 缺少能够为 sparc 目标生成目标文件所需的代码。较早的版本(1.x 和 2.x)支持它,但 llvm 用于发出目标文件的框架在当时还不够成熟。当当前框架推出时,看起来他们并没有迁移所有平台。

文档似乎暗示 llvm/gcc 的组合是已知的,但我认为该表是基于更早版本的 llvm 制成的,当时它们具有不太成熟的用于发出目标文件的框架。

在修订版r198533此线程讨论提交)中,对发出目标文件的支持已添加到其 SVN 主干中,但正如您在3.4.2 最终版本中看到的那样,在r198533中添加的文件和更改不存在。


顺便说一句,clang 目前在 sparc solaris 中不起作用(一般不确定 sparc)。解析器似乎无法解析模板;我得到核心转储之类的。大约一周前,我遇到了一个讨论 sparc/solaris clang 对齐问题的线程,这可能是 clang 在这个平台上还不能使用的原因之一。

于 2014-06-30T23:28:18.533 回答
3

如果你需要一个在 Ubuntu 机器上运行的 Sparc 交叉编译器,我知道的最简单的方法是使用 Buildroot。这是一个关于如何获取交叉编译器并在 Sparc 模拟器上测试生成的可执行文件的小教程。

于 2015-02-16T05:17:40.893 回答
3

LLVM 3.6.2 现在对 sparc 有一些支持......我能够在我的 T2000 上构建 llvm 3.6.2 和 clang 3.6.2-r100。我还没有获得 C++ 支持,但我已经构建了中等复杂的 C 应用程序,例如 htop。

我确实使用 gcc 5.2 编译了 LLVM,但是我的较低版本应该也可以工作,尽管我建议至少 gcc 4.9 并且不低于 gcc 4.7。

gentoo 上的 LLVM 出现在编译期间崩溃了,但我可以通过使用 llvm ebuild 移动到 portage 目录并手动重新启动构建来恢复它:

cd  /usr/portage/*/llvm/
ebuild llvm-3.6.2.ebuild merge

我不得不覆盖一些默认编译器:

CC="clang -target sparc-unknown-linux-gnu" 
CXX="clang++ -target sparc-unknown-linux-gnu" 
CFLAGS="-O2 -pipe"
CXXFLAGS="${CFLAGS}"

我不知道您是否可以使用它从 x86 机器上构建...虽然 clang 应该能够做到这一点。但最坏的情况是,您可能可以在 qemu-system-sparc64 vm 或一些您可以在 ebay 上找到便宜的真实硬件上实现这一点(T5xxx 硬件价格正在下降,刀片非常便宜)

我最近更新到 clang 3.8(尚未发布),除了上面的选项之外,我还能够通过传递 -lstdc++ 来编译 c++ 应用程序。我相信当作为 gcc 而不是 g++ 调用时,这与 gcc 的行为相同。

于 2015-08-13T03:21:00.473 回答