试图使自己熟悉LLVM-IR,但是不幸的是,在尝试编译时,我始终遇到段错误。我一直在对此进行测试:
define void @main() {
entry:
ret void
}
据我所知,应该与lli
一起使用时,它确实可以工作并且确实不会导致错误(我还测试了一个我发现的具有类似结果的“ hello world”,它可以在lli
中工作但编译时不行)
我一直在使用llc
和lld
进行编译,并且我使用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
除“进程已启动”和“进程已停止”位以外,这是调试器的唯一输出。
答案 0 :(得分:0)
您可以尝试使用gnu ld吗,因为错误显示error: memory read failed for 0x0
,所以我认为链接器弄乱了起始地址。请提供objdump -D a.out