KLEE: непредвиденная ошибка при встроенной сборке

Я недавно играл с KLEE. Я проследовал за документом " Сборка KLEE (LLVM 3.4) " и успешно выполнил все примеры из учебника.

Однако при запуске моей собственной программы с использованием KLEE:

$ klee -load=/usr/lib/x86_64-linux-gnu/libssl.so --libc=uclibc --posix-runtime -emit-all-errors -allow-external-sym-calls klee_client.bc

произошли некоторые ошибки. (См. Следующий вывод консоли)

KLEE: NOTE: Using klee-uclibc : /home/testuser/Downloads/klee/Release+Asserts/lib/klee-uclibc.bca
KLEE: NOTE: Using model: /home/testuser/Downloads/klee/Release+Asserts/lib/libkleeRuntimePOSIX.bca
KLEE: output directory is "/home/testuser/Downloads/klee_test/klee-out-3"
KLEE: WARNING ONCE: function "__libc_connect" has inline asm
KLEE: WARNING ONCE: function "setsockopt" has inline asm
KLEE: WARNING ONCE: function "shutdown" has inline asm
KLEE: WARNING ONCE: function "socket" has inline asm
KLEE: WARNING ONCE: function "__libc_recvfrom" has inline asm
KLEE: WARNING ONCE: function "__libc_sendto" has inline asm
KLEE: WARNING: undefined reference to function: ERR_clear_error
KLEE: WARNING: undefined reference to function: ERR_error_string
KLEE: WARNING: undefined reference to function: ERR_get_error
KLEE: WARNING: undefined reference to function: OPENSSL_config
KLEE: WARNING: undefined reference to function: SSL_CTX_ctrl
KLEE: WARNING: undefined reference to function: SSL_CTX_free
KLEE: WARNING: undefined reference to function: SSL_CTX_new
KLEE: WARNING: undefined reference to function: SSL_CTX_set_next_proto_select_cb
KLEE: WARNING: undefined reference to function: SSL_connect
KLEE: WARNING: undefined reference to function: SSL_free
KLEE: WARNING: undefined reference to function: SSL_get_error
KLEE: WARNING: undefined reference to function: SSL_library_init
KLEE: WARNING: undefined reference to function: SSL_load_error_strings
KLEE: WARNING: undefined reference to function: SSL_new
KLEE: WARNING: undefined reference to function: SSL_read
KLEE: WARNING: undefined reference to function: SSL_set_fd
KLEE: WARNING: undefined reference to function: SSL_shutdown
KLEE: WARNING: undefined reference to function: SSL_write
KLEE: WARNING: undefined reference to function: SSLv23_client_method
KLEE: WARNING: undefined reference to function: klee_posix_prefer_cex
...
KLEE: WARNING ONCE: calling external: syscall(16, 0, 21505, 40876048)
KLEE: WARNING ONCE: calling __user_main with extra arguments.
KLEE: WARNING ONCE: __syscall_rt_sigaction: silently ignoring
KLEE: WARNING ONCE: calling external: OPENSSL_config(0)
KLEE: WARNING ONCE: calling external: SSL_load_error_strings()
KLEE: WARNING ONCE: calling external: SSL_library_init()
KLEE: WARNING ONCE: calling external: printf(35435072, 46338336)
KLEE: ERROR: /home/testuser/Downloads/klee-uclibc/libc/inet/socketcalls.c:362: inline assembly is unsupported

KLEE: done: total instructions = 99493
KLEE: done: completed paths = 1
KLEE: done: generated tests = 1

Мне было любопытно, почему произошла ошибка, связанная с uclibc? Потому что я скомпилировал его так, как сказано в документе KLEE, и я не нашел никаких опций для отключения кода на ассемблере (например, no-asm) при "настройке" uclibc перед компиляцией.

Кроме того, я также заметил, что было много предупреждений о "неопределенной ссылке на функцию:...". Должен ли я скомпилировать соответствующие библиотеки в битовый код llvm вместо использования существующих общих объектов?

Спасибо!

1 ответ

Решение

Для Q1: В основном, документ KLEE учит пользователей собирать uClibc в архив LLVM IR. Многие из функций внутри uClibc содержат встроенную сборку (или даже разработаны непосредственно со сборкой). Эти сборки не будут скомпилированы в IR LLVM, вместо этого они будут поддерживаться неизменными в IR. Перед выполнением IR функции из ucLibc, KLEE проверит, включена ли какая-либо сборка в IR. Если это так, вы увидите предупреждение как "функция XXX имеет встроенный asm". Нет возможности отключить сборку. Чтобы избавиться от этих сборок, вы должны найти способ перевести их в LLVM IR.

Для Q2: вам нужно разделить процесс KLEE и программу, которая будет протестирована (например, klee_client.bc в вашем случае). Когда вы загружаете существующие общие объекты в KLEE, вы фактически связываете библиотеку с процессом KLEE, а не с тестируемой программой. Чтобы связать тестируемую программу с библиотекой, необходимо скомпилировать библиотеку в IR, а затем связать ее с тестируемой программой, изменив основную функцию в KLEE (или используя некоторые опции, встроенные в KLEE, о что мне не понятно). Когда тестируемая программа загружается и связывается с указанными библиотеками с помощью KLEE, KLEE проверяет наличие каждой требуемой функции (вызываемой некоторыми инструкциями). Если нет, вы увидите предупреждение. В вашем случае вы в основном не связывали тестируемую программу с LLVM IR LibSSL.

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