使用sqlite3数据库编译pintool

时间:2016-07-14 10:18:22

标签: c++ linux dynamic-linking dbi intel-pin

我正在写一个pintool来检测我的二进制文件。

我想使用sqlite3数据库存储有关说明的信息。

我可以编译并执行sqlite3“helloworld”示例,没有任何问题。 我也可以在没有sqlite连接的情况下编译和执行我的pintool。 但是,每当我在pintool中集成sqlite代码时,我都会遇到错误:

  

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/Software/pin/source/include/pin/pintool.ver -fabi-version = 2 -o obj-intel64 / sqliteTest.so obj-intel64 / sqliteTest.o -L / home / roman / Software / pin / intel64 / runtime / pincrt -L / home / roman / Software / pin / intel64 / lib -L ​​/ home / roman / Software / pin / intel64 / lib-ext -L / home / roman / Software / 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给出了以下结果:

  3.   

    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 *:
    2.   

      -rw-r - r-- 1 root root 1156080 2月22日17:43 /usr/lib/x86_64-linux-gnu/libsqlite3.a

           

      -rw-r - r-- 1 root root 965 Feb 22 17:43 /usr/lib/x86_64-linux-gnu/libsqlite3.la

           

      lrwxrwxrwx 1 root root 19 Feb 22 17:43 /usr/lib/x86_64-linux-gnu/libsqlite3.so - > libsqlite3.so.0.8.6

           

      lrwxrwxrwx 1 root root 19 Feb 22 17:43 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 - > libsqlite3.so.0.8.6

           

      -rw-r - r-- 1 root root 870240 Feb 22 17:43 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6

      1. sqlite3版本为3.13.0

      2. 当我运行pin工具时,我得到了以下内容:

      3.   

        / home / roman / Software / 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选项时,我得到以下信息:

        3.   

          尝试打开/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对外部库有特殊要求,我无法理解。我降级到第v.2.8版,一切正常。

2 个答案:

答案 0 :(得分:2)

Pin在启动时更改LD_LIBRARY_PATH,这可能意味着它在系统目录中找不到libsqlite。引脚3还避免链接某些系统库以增强隔离。

您不应该在Pin 2或Pin 3中链接libpthread,否则您将来会遇到微妙的错误。 Sqlite似乎依赖于libpthread。如果你需要做一些需要数据库的事情,我建议你为它创建一个外部进程,并使用命名管道/套接字与它进行通信。

答案 1 :(得分:1)

显然pin v.3对外部库有特殊要求,我无法理解。我降级到第v.2.8版,一切正常。