使用LLVM的中途交叉编译 - 在Raspberry Pi上更快地编译

时间:2014-03-20 15:44:29

标签: c clang llvm raspberry-pi

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=vfp clang ,但失败并出现相同的错误。 你知道如何解决这个错误或者有一些建议可以帮助我使用LLVM来加速我的编译过程吗?

提前致谢

1 个答案:

答案 0 :(得分:5)

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