Linux 从LLVM位代码创建位置独立的对象文件

Linux 从LLVM位代码创建位置独立的对象文件,linux,llvm,dynamic-linking,Linux,Llvm,Dynamic Linking,我有一个llvm模块,它已作为位代码文件转储到llvm::WriteBitCodeFile。我想将此位代码文件转换为本机动态加载库,其中包含模块中的函数 我该怎么做?为此,我尝试使用llc,但这会产生明显不可重定位的代码,因为在执行以下步骤后: llc -enable-pie -cppgen=functions -filetype=asm executableModule -o em.s 然后,将gnu组装为一个对象文件: as -o mylib.o em.s 最后,尝试生成具有以下内容的共

我有一个llvm模块,它已作为位代码文件转储到
llvm::WriteBitCodeFile
。我想将此位代码文件转换为本机动态加载库,其中包含模块中的函数

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

llc -enable-pie -cppgen=functions -filetype=asm executableModule -o em.s
然后,将gnu
组装为一个对象文件:

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

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

谢谢!!!!,有没有一种工具可以直接从IR位代码构建库,而不依赖于汇编程序?我已经看到llc支持本机代码输出,但它是实验性的。有生产质量方法吗?嗨。您能告诉我选项“-重新安置模型”是在哪里描述的吗?我可以为“lli”找到它,但“lli”不是“llc”。@beroal它在
llc--help
的输出中描述。遗憾的是,手册页只包含有限责任公司的一小部分选项。我花了1.5天的时间才发现llc有这个标志。