Скомпилированный LLVM-IR Basi c приводит к ошибкам сегментации - PullRequest
1 голос
/ 04 августа 2020

Пытаюсь познакомиться с 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

Кроме битов «Процесс запущен» и «Процесс остановлен», это единственный вывод отладчика.

1 Ответ

0 голосов
/ 05 августа 2020

вы можете попробовать использовать gnu ld, поскольку ошибка показывает error: memory read failed for 0x0, я предполагаю, что компоновщик возится с начальным адресом. предоставьте вывод objdump -D a.out

...