c - LLVM 解释器 (lli) 和共享对象加载

标签 c linker clang llvm lli

我正在尝试使用 lli 来解释/JIT 编译位代码文件 a.bc,该文件使用共享对象 afl-llvm 中定义的函数-rt.so。当我尝试像这样使用 lli 时

lli -dlopen ./afl-llvm-rt.so a.bc

我得到:

PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace.
Stack dump:
0.  Program arguments: lli -load ./afl-llvm-rt.o a.bc 
#0 0x00007fa2a620f833 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/lib/x86_64-linux-gnu/libLLVM-12.so.1+0xa99833)
#1 0x00007fa2a620dbe0 llvm::sys::RunSignalHandlers() (/lib/x86_64-linux-gnu/libLLVM-12.so.1+0xa97be0)
#2 0x00007fa2a620fe65 (/lib/x86_64-linux-gnu/libLLVM-12.so.1+0xa99e65)
#3 0x00007fa2a57683c0 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x153c0)
zsh: segmentation fault (core dumped)  lli -load ./afl-llvm-rt.o a.bc

进一步调查 gdb 发现函数地址没有设置:

> gdb lli
(gdb) r -load ./afl-llvm-rt.o a.bc
Starting program: /usr/bin/lli -load ./afl-llvm-rt.o a.bc
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) bt
#0  0x0000000000000000 in ?? ()
#1  0x00007ffff7fca021 in sancov.module_ctor_trace_pc_guard ()
#2  0x00007ffff4f46118 in llvm::MCJIT::runFunction(llvm::Function*, llvm::ArrayRef<llvm::GenericValue>) () from /lib/x86_64-linux-gnu/libLLVM-12.so.1
#3  0x00007ffff4ef9a57 in llvm::ExecutionEngine::runStaticConstructorsDestructors(llvm::Module&, bool) () from /lib/x86_64-linux-gnu/libLLVM-12.so.1
#4  0x00007ffff4f4587f in llvm::MCJIT::runStaticConstructorsDestructors(bool)
    () from /lib/x86_64-linux-gnu/libLLVM-12.so.1
#5  0x000000000041391b in main ()

但是,如果我像往常一样编译文件,使用 clang a.bc ./afl-llvm-rt.so,输出的可执行文件工作正常。

如何使 lli 动态链接 a.bcafl-llvm-rt.so

编辑: 我将 afl-llvm-rt.so 编译为一个 LLVM IR 文件,然后我使用了 llvm-link a.bc afl-llvm-rt.bc -o result.bc 将它们链接在一起。之后,我尝试了 lli result.bc,它给出了以下内容:

ocelaiwo@E490:~/Misc/ff> lli result.bc
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace.
Stack dump:
0.      Program arguments: lli result.bc 
#0 0x00007efc8d3d9833 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/lib/x86_64-linux-gnu/libLLVM-12.so.1+0xa99833)
#1 0x00007efc8d3d7be0 llvm::sys::RunSignalHandlers() (/lib/x86_64-linux-gnu/libLLVM-12.so.1+0xa97be0)
#2 0x00007efc8d3d9e65 (/lib/x86_64-linux-gnu/libLLVM-12.so.1+0xa99e65)
#3 0x00007efc8c9323c0 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x153c0)
zsh: segmentation fault (core dumped)  lli result.bc

但是如果我 clang result.bc -o resultresult 可执行文件执行得很好。

最佳答案

尝试对 lli 的 --load 选项,如回答 here .使用 glib 库的示例代码:

lli --load=/usr/lib/x86_64-linux-gnu/libglib-2.0.so my-bicode-file.bc

我还发现选项 -force-interpreter 是一个有用的调试提示,例如它可以显示缺少的符号:

LLVM ERROR: Could not resolve external global address: some_external_symbol

然后您可以调查该符号(例如函数)在您系统上的位置。

关于c - LLVM 解释器 (lli) 和共享对象加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63968275/

相关文章:

c - 以下分配只会导致警告。这说明 C 如何处理类型等价?

c - matlab和C中的内存管理问题

c - 没有库函数的 C 中的反向字符串函数

c++ - 如何在动态链接库中处理 'extern' 变量?

c++ - Constexpr 指针值

c - 如何提升函数以在 C 中获取额外参数?

c++ - 为什么在 GCC 和 clang 之间编译的 c++17 lambda 有差异?

c - 哪些 zlib 函数与 WinZip 兼容?

c++ - 构建 CUDA/C++ 代码时链接器错误

c++ - 编译器错误与链接器错误?