【问题标题】:LLVM: How to Cross Compile C++ ProgramsLLVM:如何交叉编译 C++ 程序
【发布时间】:2015-03-07 18:47:17
【问题描述】:

我尝试使用 LLVM 将 C++ 源代码编译为 arm 二进制文件。这是一个例子:

//hello.cpp
#include <iostream>
int main() {
    std::cout << "Hello World!\n" << std::endl;
    return 0;
}

我使用以下命令:

clang++ -emit-llvm -c hello.cpp -o hello.bc
llc -march=arm hello.bc -o hello.s // I do need this step for running some backend optimizations 
arm-none-linux-gnueabi-g++ -static hello.s -o hello.exe

到目前为止没有警告或错误。然后我尝试使用 qemu-arm 和 gem5 模拟器运行“hello.exe”,都因分段错误而崩溃:

qemu-arm 的输出:

qemu-arm hello.exe
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault (core dumped)

输出形式 gem5:

~/gem5/build/ARM/gem5.opt ~/gem5/configs/example/se.py -c ./hello.exe
**** REAL SIMULATION ****
info: Entering event queue @ 0.  Starting simulation...
panic: Page table fault when accessing virtual address 0xfffffff4
@ tick 2035000
[invoke:build/ARM/sim/faults.cc, line 70]
Memory Usage: 646432 KBytes
Program aborted at cycle 2035000
Aborted (core dumped)

我使用的是 clang 版本 3.7.0svn。我错过了什么吗?事实上,编译过程用于几个 c 程序,它们都可以正常工作。但不适用于 c++ 程序。

【问题讨论】:

  • 您的构建和执行环境是否具有兼容的 C++ 库?
  • @CarlNorum 是的,如果 c++ 库不兼容,就会发生分段错误。我使用的是预编译的 arm 交叉编译器,我很确定它有自己的 c++ 库。但是如何检查它是否兼容呢?或者我可以使用命令行选项来强制 llvm 后端使用某些 c++ 库吗?非常感谢您的帮助:)
  • 也许您应该使用与您的编译器匹配的链接器进行链接(即仅在使用g++ 编译时才使用g++ 链接)

标签: c++ llvm cross-compiling clang++ libstdc++


【解决方案1】:

感谢大家的帮助。我刚刚弄清楚它是如何工作的:

clang++ -target arm-none-linux-gnueabi --sysroot=/usr/local/arm-2009q3 -static hello.cpp -emit-llvm -c -I /usr/local/arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/
llc hello.bc
arm-none-linux-gnueabi-g++ -static hello.s -o hello.exe

arm 二进制文件在 qemu-arm 和 gem5 上都能正常运行。

我认为 LLVM IR 应该完全独立于目标机器,但实际上它不是(奇怪...)

我仍然不明白为什么 c 程序没有这个问题。

【讨论】:

  • 对于C,你很幸运。我相信如果您尝试按值传递/返回结构,例如,或者在成员之间有间隙的结构,那么您会看到差异。毕竟,ARM 是 32 位的,而且很可能您正在为 x86-64 编译 :)
【解决方案2】:

这不会以这种方式工作。事实上,LLVM IR 不是目标中立的,因此将 x86 IR 编译到 ARM 是行不通的:ABI 不同,等等。

您需要使用 clang 的 -target 选项(或将 clang 构建为指定默认目标的交叉编译器)。

【讨论】:

  • 感谢您的回复。我现在正在阅读有关如何使用 -target 选项进行交叉编译的 llvm 文档。 BTW,我不明白为什么上面的方法在c程序上没有问题?
猜你喜欢
  • 2011-09-27
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-25
  • 2020-04-27
  • 2020-08-29
相关资源
最近更新 更多