【发布时间】: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++