我试着熟悉LLVM-IR,但不幸的是,我在尝试编译时总是遇到段错误。我特别测试过这个:
define void @main() {
entry:
ret void
}根据我所知道的,它在与lli一起使用时应该可以工作,并且确实不会导致错误(我还测试了一个'hello world‘,我找到了类似的结果,在lli中可以工作,但在编译时不能)
我一直在使用llc和lld进行编译,我使用的是ubuntu linux (嗯,bedrock linux,不过是ubuntu内核)。版本是一致的(LLVM10),我使用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除了“进程已启动”和“进程已停止”位之外,这是调试器的唯一输出。
发布于 2020-08-05 17:29:31
您可以尝试使用gnu ld吗?由于错误显示为error: memory read failed for 0x0,我假设链接器正在扰乱起始地址。请提供objdump -D a.out的输出
https://stackoverflow.com/questions/63238177
复制相似问题