我正在尝试使用lli来解释/即时编译一个使用共享对象afl-llvm-rt.so中定义的函数的位码文件a.bc。当我尝试像这样使用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.bc和afl-llvm-rt.so
编辑:我将afl-llvm-rt.so编译为LLVM文件,然后使用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 result,result可执行文件就可以很好地执行。
发布于 2021-05-05 16:02:55
按照here的回答,尝试对lli使用--load选项。使用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然后,您可以调查该符号(例如,函数)可能在您的系统中的位置。
https://stackoverflow.com/questions/63968275
复制相似问题