[英]LLVM: How to Cross Compile C++ Programs
我尝试使用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作为指定默认目标的交叉编译器)。
谢谢大家的帮助。 我只是弄清楚它是如何工作的:
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程序没有这个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.