我正在尝试将 lambda 表达式从 schema 编译为 llvm-ir,但在处理与位置无关的代码时遇到了问题。
source:
(lambda (x) (display x))
target:
bunch of declares...
define %SObj* @G7() {
entry:
%calltmp = call %SObj* @closure_create(i64 ptrtoint (%SObj* (%SObj*)* @G8 to i64), %SObj* null)
ret %SObj* %calltmp
}
define %SObj* @G8(%SObj* %G6) {
entry:
%calltmp = call %SObj* @display(%SObj* %G6)
ret %SObj* %calltmp
}
define i32 @main(i32 %0, i8** %1) {
entry:
%calltmp = call %SObj* @G7()
%calltmp1 = call %SObj* @display(%SObj* %calltmp)
ret i32 0
}
编译这个:
llc code.ll && clang code.s -L/usr/lib -lgc -lSRuntime -o code -v
其中 code.ll 是打印的 ll-ir 模块,它给了我错误消息:
/usr/bin/ld: /tmp/code-1c0b5f.o: relocation R_X86_64_32 against symbol `G8' can not be used when making a PIE object; recompile with -fPIE
阅读 PIE 并不能完全帮助我解决我的问题。有人可以解释一下,为什么 G7 中的 ptrtoint 转换会导致代码成为非 PIC 以及如何实现这种行为?
编辑:通过将 --relocation-model=pic 添加到 llc 调用(编译模块)解决了问题
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)