Пытаюсь познакомиться с LLVM-IR, но, к сожалению, постоянно получаю ошибки segfault при попытке компиляции. Я тестировал, в частности, следующее:
define void @main() {
entry:
ret void
}
Что из того, что я знаю, должно работать и действительно не приводит к ошибке при использовании с lli
(я также тестировал 'привет, мир 'Я обнаружил с похожими результатами, работает в lli
, но не при компиляции)
Я использовал llc
и lld
для компиляции, и я использую ubuntu linux (ну, корень linux но ядро Ubuntu). Версии согласованы (LLVM 10), и я тестировал с использованием компоновщика gnu вместо lld, который дал тот же результат. Я попытался явно установить целевую тройку без результата. Я также попытался переустановить LLVM и связанные с ним инструменты, но безрезультатно. Я получаю те же результаты на машине windows через WSL. У меня есть некоторый базовый c опыт работы с NASM, и, насколько я понимаю, вам нужно делать правильные системные вызовы для корректного выхода из программы сборки, возможно, то же самое верно и для LLVM-IR? Я могу только предположить, что делаю что-то ужасно неправильно, но я не могу понять, что это.
Я запускаю команды llc test.ll --filetype=obj && ld.lld test.o && ./a.out
для компиляции (как указано выше, я пробовал разные параметры ).
Есть какие-нибудь предложения о том, что здесь может происходить?
Изменить:
Я попытался зайти в него с помощью отладчика, я установил точку останова на main и что интересно, он сегментирует ошибки до того, как достигнет этой точки останова. Результатом отладчика будет:
* thread #1, name = 'a.out', stop reason = signal SIGSEGV: invalid address (fault address: 0x1)
frame #0: 0x0000000000000001
error: memory read failed for 0x0
Кроме битов «Процесс запущен» и «Процесс остановлен», это единственный вывод отладчика.