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

标签 linux llvm dynamic-linking

我有一个 llvm 模块,我用 llvm::WriteBitcodeToFile 转储为位码文件。我想将此位码文件转换为包含模块中函数的 native 动态可加载库。

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

最佳答案

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

关于linux - 从 LLVM 位代码创建与位置无关的目标文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15985186/

相关文章:

linux - 如何在Centos桌面中通过命令行编辑 "File Management Preferences"

segmentation-fault - 在 Rust 中调用 llvm_sys 的 LLVMCreateTargetMachine 生成目标文件时出现段错误

c++ - 尝试链接到 SDL_ttf 共享对象文件时 g++ 中的链接器错误

c - 将 "too many"参数传递给外部函数是否安全?

python - Python 模块 wx.GraphicsContext 中的函数 DrawEllipse 仅适用于 Windows,但不适用于 Linux

linux - 如何在 Linux 中获取当前终端的当前光标位置?

r - 如何在 .sh 文件中运行 R 作业

c++ - 铛++ : fatal error: 'unistd.h' file not found

c++ - 如何解除分配 llvm::module

mingw - 使用 MinGW 时如何动态链接到 DLL(动态链接库)?