Linker 已解决:重新定位R_X86_64_32与符号'G8';制作饼图对象时不能使用;使用-fPIE重新编译

Linker 已解决:重新定位R_X86_64_32与符号'G8';制作饼图对象时不能使用;使用-fPIE重新编译,linker,llvm,linker-errors,llvm-ir,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* %ca

我正在尝试将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
读馅饼并不能帮我解决问题。有人能给我解释一下,为什么G7中的ptrtoint强制转换会导致代码是非PIC的,然后如何实现这种行为


编辑:问题通过向llc调用中添加--relocation model=pic得到解决,llc调用编译模块

您是否按照错误消息所示重新编译了
fPIE
标志?谢谢!不太容易找到,因为——在llc手册页中没有提到重新定位模型,只有在lli中提到(在llc的“请参阅”部分中引用)。我也有同样的错误,我是C/C++新手。我在哪里可以获得有关如何使用fPIE标志的信息?您是否按照错误消息的建议重新编译了
fPIE
标志?谢谢!不太容易找到,因为——在llc手册页中没有提到重新定位模型,只有在lli中提到(在llc的“请参阅”部分中引用)。我也有同样的错误,我是C/C++新手。在哪里可以获得有关如何使用fPIE标志的信息?