Я попытался использовать LLVM для компиляции исходного кода на C++ для создания двоичных файлов. Вот пример:LLVM: как перекрестно компилировать программы на С ++
//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
Там не было никаких предупреждений или ошибок до сих пор. Затем я попытался запустить "hello.exe" с помощью QEmu-руки и gem5 тренажере, как столкнулся с ошибкой сегментации:
выход из для QEMU руки:
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++ несовместимы. Я использовал precompiled arm cross compiler, я уверен, что у него есть собственные библиотеки C++. Но как проверить совместимость? Или я могу использовать параметры командной строки, чтобы заставить llvm-бэкэнд использовать определенные библиотеки C++? Большое спасибо за помощь :) –
Возможно, вам следует установить ссылку с помощью компоновщика, соответствующего вашему компилятору (т. Е. Ссылку с 'g ++' только при компиляции с 'g ++') –