【问题标题】:Half way cross-compilation leveraging LLVM - Compile faster on the Raspberry Pi利用 LLVM 进行中途交叉编译 - 在 Raspberry Pi 上编译更快
【发布时间】:2014-03-20 15:44:28
【问题描述】:

Raspberry Pi 需要大量时间来编译 C 代码。 我想加速编译。但是我得到一个编译错误。

为此,由于我已经在我的 PC 上编写代码,我想使用我的 PC,我想使用 LLVM(随 cygwin 提供)来生成可执行文件的 LLVM 汇编语言版本。然后,将其发送到 Raspberry Pi 以最终转换为本机 (ARM) 可执行文件。

我希望能够更快地获得可执行文件,因为我可以在链接 (llvm-link) 之前在我的多核机器上将我的代码并行编译为 LLVM 语言。 我希望 Raspberry Pi 本身的最后一步,将 LLVM 语言转换为可执行二进制文件会很短。

我们来看一个示例代码:

#include <stdio.h>

int main(){
  printf("0");
  return 0;
}

然后在我的电脑上运行

clang a.c -emit-llvm -S

这会生成一个名为 a.s 的文件,它是 .c 文件的 LLVM 语言版本

然后,我将 a.s 发送到 Raspberry Pi 并在其上运行命令 llc -filetype=obj a.s 以生成 a.s.o 目标文件。

但是当我想从这个目标文件在 Rasp Pi 上创建一个可执行文件时,我得到一个错误:

clang a.s.o -o a.out
/usr/bin/ld: error: a.out uses VFP register arguments, a.s.o does not
/usr/bin/ld: failed to merge target specific data of file a.s.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我尝试在最后一步将以下标志 -marm -mfloat-abi=hard -mfpu=vfpclang 一起使用,但失败并出现相同的错误。 你知道如何解决这个错误或者有一些建议可以帮助我使用 LLVM 来加快我的编译过程吗?

提前致谢

【问题讨论】:

标签: c clang llvm raspberry-pi


【解决方案1】:

LLVM IR 不可移植。它包含各种特定于您的机器的东西(是 int 32 位或 64 位、sizeof 和调用约定)。为了让它工作,你需要传递 clang 参数,就好像你正在做一个完整的交叉编译一样。此时由于 clang 是一个完整的交叉编译器,您不妨只编译目标文件。

所以在你的电脑上用clang -target armv6-linux-gnueabi -integrated-as -marm -mfloat-abi=hard -mfpu=vfpu -c编译目标文件,然后用ld链接到pi上。

编辑:

既然你提到 cygwin clang 集成汇编器不起作用,最好的选择是输出 arm 汇编:clang -target armv6-linux-gnueabi -marm -mfloat-abi=hard -mfpu=vfpu -S

【讨论】:

  • 您好,在 cygwin 上尝试过 clang,我不得不添加选项 -S。这是为了生成程序集,而不是尝试创建失败的目标文件(/tmp/a-QlWm4u.s:1:错误:未知伪操作:`.syntax')。此外,在 cygwin 上,似乎不支持 -mfpu=vfpu。完成后,我成功地在 Pi 上编译了程序集。
  • 这个解决方案的重点是生成目标文件而不是汇编。无需任何额外的标志或软件即可将更多工作卸载到电脑上。
  • 好吧,看起来 Cygwin clang 有一个很好的 arm 集成汇编器,在这种情况下输出 arm 汇编可能是最好的选择。
  • 或者可能是因为我拼错了集成,所以 clang 使用的是系统组装器而不是集成臂。
  • 您还需要使用正确的 sysroot(例如,您的 raspbian 安装的副本)。
猜你喜欢
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
  • 2017-03-30
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多