Я пишу pintool для инструмента моего двоичного файла.
Я хотел бы использовать базу данных sqlite3 для хранения информации об инструкциях.
Я могу без проблем скомпилировать и выполнить sqlite3 «helloworld».
Также я могу скомпилировать и выполнить мой pintool без подключения к SQLite.
Однако всякий раз, когда я интегрирую sqlite-код в pintool, у меня возникает ошибка:
Ошибка dlopen: библиотека «libsqlite3.so.0» не найдена
Что именно я делаю:
Моя команда компоновки выглядит так (компиляция завершается без ошибок):
g ++ -shared -Wl, — hash-style = sysv /home/roman/Software/pin/intel64/runtime/pincrt/crtbeginS.o -Wl, -Bsymbolic -Wl, — version-script = / home / roman / Программное обеспечение / pin / source / include / pin / pintool.ver -fabi-version = 2 -o obj-intel64 / sqliteTest.so obj-intel64 / sqliteTest.o -L / home / roman / Программное обеспечение / pin / intel64 / runtime / pincrt -L / home / roman / программное обеспечение / pin / intel64 / lib -L / home / roman / программное обеспечение / pin / intel64 / lib-ext -L / home / roman / программное обеспечение / pin / extras / xed-intel64 / lib — L / usr / lib / i386-linux-gnu -lpin -lxed /home/roman/Software/pin/intel64/runtime/pincrt/crtendS.o -lpin3dwarf -ldl-dynamic -nostdlib -lstlport-dynamic -lm-dynamic — lc-dynamic -lsqlite3
Команда LDD ldd obj-intel64 / sqliteTest.so дает мне следующий результат:
linux-vdso.so.1 => (0x00007fff4f4aa000)
libxed.so => не найден
libpin3dwarf.so => не найден
libdl-dynamic.so => не найден
libstlport-dynamic.so => не найден
libc-dynamic.so => не найден
libsqlite3.so.0 => /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007fd46221f000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd462002000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd461dfe000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd461a34000)
/lib64/ld-linux-x86-64.so.2 (0x000055565d930000)
-rw-r — r— 1 корневой корень 1156080 22 февраля 17:43 /usr/lib/x86_64-linux-gnu/libsqlite3.a
-rw-r — r— 1 корневой корень 965 22 февраля 17:43 /usr/lib/x86_64-linux-gnu/libsqlite3.la
lrwxrwxrwx 1 root root 19 фев 22 17:43 /usr/lib/x86_64-linux-gnu/libsqlite3.so -> libsqlite3.so.0.8.6
lrwxrwxrwx 1 root root 19 фев 22 17:43 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 -> libsqlite3.so.0.8.6
-rw-r — r— 1 корневой корень 870240 22 февраля 17:43 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6
Версия sqlite3 3.13.0
Когда я запускаю булавку, я получаю следующее:
/ home / roman / Программное обеспечение / pin / pin -t /home/roman/Software/pin/source/tools/sqliteTest/obj-intel64/sqliteTest.so — ./test.bin
E: Невозможно загрузить /home/roman/Software/pin/source/tools/sqliteTest/obj-intel64/sqliteTest.so: сбой dlopen: библиотека «libsqlite3.so.0» не найдена
Если вам интересно узнать код:
VOID StartApp(VOID *v){
int rc;
char nameDB[100];
sprintf(nameDB, "pin_test_0.dat");
rc = sqlite3_open(nameDB, &sqliteDB);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(sqliteDB));
return;
}else{
fprintf(stderr, "Opened database (%s) successfully\n", nameDB);
}
sqlite3_close(sqliteDB);
//Start random number generator
srand(rdtsc());
}
...
INT main(int argc, char *argv[]){
if( PIN_Init(argc,argv) )
{
return Usage();
}
TRACE_AddInstrumentFunction(Trace, 0);
PIN_AddApplicationStartFunction(StartApp, 0);
PIN_AddFiniFunction(Fini, 0);
PIN_StartProgram();
return 0;
}
Когда я установил опции -Wl и —verbose во время соединения, я получил следующую информацию:
попытка открыть /usr/lib/i386-linux-gnu/libsqlite3.so не удалась
попытка открыть /usr/lib/i386-linux-gnu/libsqlite3.a не удалась
попытка открыть /usr/lib/gcc/x86_64-linux-gnu/5/libsqlite3.so не удалась
попытка открыть /usr/lib/gcc/x86_64-linux-gnu/5/libsqlite3.a не удалась
попытка открыть /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libsqlite3.so завершилась успешно
-lsqlite3 (/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libsqlite3.so)
Ты хоть представляешь, что не так с моими руками?
Судя по всему, у pin v.3 есть особые требования к внешним библиотекам, которые я не мог понять. Я понизил до pin v.2.8, и все работало нормально.
Pin изменяет LD_LIBRARY_PATH при запуске, что может означать, что он не найдет libsqlite в системных каталогах. Вывод 3 также позволяет избежать связывания с определенными системными библиотеками для повышения изоляции.
Вы не должны ссылаться на libpthread в контакте 2 или 3, иначе вы столкнетесь с небольшими ошибками в будущем. Sqlite, кажется, зависит от libpthread. Если вам нужно сделать что-то, что требует базы данных, я рекомендую вам создать для этого внешний процесс и общаться с ним, используя именованные каналы / сокеты.
Судя по всему, у pin v.3 есть особые требования к внешним библиотекам, которые я не мог понять. Я понизил до pin v.2.8, и все работало нормально.