2013-04-13 46 views
5

我有一个llvm模块,我倾销为llvm::WriteBitcodeToFile的位代码文件。我想将此位代码文件转换为包含模块中功能的本机可动态加载库。从LLVM位创建位置独立的目标文件位代码

我该怎么做?我尝试使用llc对于这一点,但是这将产生代码,显然是不重定位的,因为执行以下步骤之后:

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

然后,用GNU as assemblying成目标文件:

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 

回答

8

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

+0

谢谢!!!!,是否有一种工具直接从IR位代码构建库,而不依赖于汇编程序? – lurscher

+0

我见过这个llc支持本地代码输出,但它是实验性的。对此有没有生产质量的方法? – lurscher

+0

嗨。你会告诉选择“-relocation-model”的选项吗?我可以为“lli”找到它,但“lli”不是“llc”。 – beroal