从LLVM位代码创建位置无关的目标文件

时间:2013-04-13 07:00:04

标签: linux llvm dynamic-linking

我有一个llvm模块,我将其作为带有llvm::WriteBitcodeToFile的bitcode文件转储。我想将此bitcode文件转换为包含模块中函数的本机动态可加载库。

我该怎么做?我尝试使用llc来实现此目的,但这会生成显然不可重定位的代码,因为在执行以下步骤之后:

llc -enable-pie -cppgen=functions -filetype=asm executableModule -o em.s

然后,将gnu as汇总到一个目标文件中:

as -o mylib.o em.s

最后,尝试使用:

生成共享库
gcc -shared -o libmyfile.so -fPIC mylib.o

因错误而失败:

/usr/bin/ld: error: mylib.o: requires dynamic R_X86_64_PC32 reloc against 'X.foo' which may overflow at runtime; recompile with -fPIC
collect2: ld returned 1 exit status

1 个答案:

答案 0 :(得分:10)

您需要设置重定位模型。像-llc -relocation-model = pic之类的东西。不要使用PIE,因为它适用于可执行文件,而不适用于库。另外,-cppgen在这里没有任何意义,只适用于cpp后端。