Компиляция pintool с базой данных sqlite3

Я пишу pintool для инструмента моего двоичного файла.

Я хотел бы использовать базу данных sqlite3 для хранения информации об инструкциях.

Я могу без проблем скомпилировать и выполнить sqlite3 «helloworld».
Также я могу скомпилировать и выполнить мой pintool без подключения к SQLite.
Однако всякий раз, когда я интегрирую sqlite-код в pintool, у меня возникает ошибка:

Ошибка dlopen: библиотека «libsqlite3.so.0» не найдена

Что именно я делаю:

  1. Моя команда компоновки выглядит так (компиляция завершается без ошибок):

    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

  2. Команда 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)

  1. Ссылка на символ ls -l / usr / lib / x86_64-linux-gnu / libsqlite *:

-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

  1. Версия sqlite3 3.13.0

  2. Когда я запускаю булавку, я получаю следующее:

/ 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» не найдена

  1. Если вам интересно узнать код:

    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;
    }
    
  2. Когда я установил опции -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, и все работало нормально.

0

Решение

Pin изменяет LD_LIBRARY_PATH при запуске, что может означать, что он не найдет libsqlite в системных каталогах. Вывод 3 также позволяет избежать связывания с определенными системными библиотеками для повышения изоляции.

Вы не должны ссылаться на libpthread в контакте 2 или 3, иначе вы столкнетесь с небольшими ошибками в будущем. Sqlite, кажется, зависит от libpthread. Если вам нужно сделать что-то, что требует базы данных, я рекомендую вам создать для этого внешний процесс и общаться с ним, используя именованные каналы / сокеты.

1

Другие решения

Судя по всему, у pin v.3 есть особые требования к внешним библиотекам, которые я не мог понять. Я понизил до pin v.2.8, и все работало нормально.

1

По вопросам рекламы [email protected]