我试图使用LLVM编译C ++源代码来准备二进制文件。这是一个例子:
//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 ++程序。
这不会以这种方式起作用。实际上,LLVM IR并不是非特定目标,因此将x86 IR编译为ARM是行不通的:ABI不同,等等。
您需要使用clang的-target选项(或将clang作为指定默认目标的交叉编译器来构建)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句