基本的已编译LLVM-IR会导致分段错误

时间:2020-08-03 23:16:41

标签: llvm llvm-ir

试图使自己熟悉LLVM-IR,但是不幸的是,在尝试编译时,我始终遇到段错误。我一直在对此进行测试:

define void @main() {
entry:
  ret void
}

据我所知,应该与lli一起使用时,它确实可以工作并且确实不会导致错误(我还测试了一个我发现的具有类似结果的“ hello world”,它可以在lli中工作但编译时不行)

我一直在使用llclld进行编译,并且我使用ubuntu linux(嗯,基岩linux却是ubuntu内核)。版本是一致的(LLVM 10),我已经使用gnu链接器而不是lld进行了测试,其结果相同。我尝试将目标三元组显式设置为无结果。我也尝试过重新安装LLVM和相关工具,但无济于事。我通过WSL在Windows机器上得到了相同的结果。我对NASM有一些基本的经验,据我了解,您需要进行适当的syscall才能正常退出汇编程序,对于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 :(得分:0)

您可以尝试使用gnu ld吗,因为错误显示error: memory read failed for 0x0,所以我认为链接器弄乱了起始地址。请提供objdump -D a.out

的输出