10

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

我该怎么做呢?我尝试使用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
4

1 回答 1

15

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

于 2013-04-14T08:30:13.870 回答