解决:制作PIE对象时,不能使用针对符号'G8'的重定位R_X86_64_32;用-fPIE重新编译

时间:2020-05-30 17:40:26

标签: linker llvm linker-errors llvm-ir

我正在尝试将lambda表达式从scheme编译为llvm-ir,并且遇到位置无关代码的麻烦。

来源:

(lambda (x) (display x)) 

目标:

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的,然后又将如何实现这种行为?

编辑:通过向llc调用中添加--relocation-model = pic来解决了问题,该代码会编译模块

0 个答案:

没有答案