【问题标题】:Unable to cross-compile to SPARC using clang无法使用 clang 交叉编译到 SPARC
【发布时间】:2013-10-01 14:27:19
【问题描述】:

所以情况如下:我需要能够从能够从 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,但收效甚微。

【问题讨论】:

  • Clang 的 documentation 表明 SPARC 支持不完整。
  • 您是否查看了最新的代码并自己构建了它?我确信 ubuntu 中的 clang/llvm 是 svn trunk 背后的好方法。我看到偶尔会为 sparc 提交 LLVM,因此至少 llvm 支持应该会有所改善。

标签: c++ c clang sparc llvm-clang


【解决方案1】:

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

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

在修订版r198533this thread 讨论了提交)中添加了对发出目标文件的支持,但正如您在3.4.2 final release 中看到的那样,r198533 中添加的文件和更改不是现在。


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

【讨论】:

  • Debian 由于对齐错误而存在与核心转储相同的问题。
  • Clang 现在可以在 Sparc64 上运行.. 你应该更新这篇文章。然而,它仍然使用来自 binutils 的链接器和汇编器,而不是内置的。
  • @cb88 我会尽快构建它,我会用我的结果编辑我的答案。
【解决方案2】:

如果您需要在 Ubuntu 机器上运行 Sparc 的交叉编译器,我知道的最简单的方法是使用 Buildroot。 Here's a small tutorial 了解如何获取交叉编译器并在 Sparc 模拟器上测试生成的可执行文件。

【讨论】:

    【解决方案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 ebuilds 的 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 的行为相同。

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 1970-01-01
      • 2011-09-02
      • 2017-06-22
      • 1970-01-01
      • 2019-12-11
      • 2013-01-19
      • 1970-01-01
      • 2016-05-11
      相关资源
      最近更新 更多