LLVM Inteopleter (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.bc с участием afl-llvm-rt.so?

РЕДАКТИРОВАТЬ: я скомпилировал afl-llvm-rt.so чтобы вместо этого быть IR файлом 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 исполняемый файл выполняется нормально.

1 ответ

Попробуйте --loadвариант lli, как здесь ответили . Пример кода, который будет использовать библиотеку 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

Затем вы можете выяснить, где этот символ (например, функция) может находиться в вашей системе.

Другие вопросы по тегам