我正在写一个pintool来检测我的二进制文件。
我想使用sqlite3数据库存储有关说明的信息。
我可以编译并执行sqlite3“helloworld”示例,没有任何问题。 我也可以在没有sqlite连接的情况下编译和执行我的pintool。 但是,每当我在pintool中集成sqlite代码时,我都会遇到错误:
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/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
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 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
sqlite3版本为3.13.0
当我运行pin工具时,我得到了以下内容:
/ 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”
如果你想知道代码:
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对外部库有特殊要求,我无法理解。我降级到第v.2.8版,一切正常。
答案 0 :(得分:2)
Pin在启动时更改LD_LIBRARY_PATH,这可能意味着它在系统目录中找不到libsqlite。引脚3还避免链接某些系统库以增强隔离。
您不应该在Pin 2或Pin 3中链接libpthread,否则您将来会遇到微妙的错误。 Sqlite似乎依赖于libpthread。如果你需要做一些需要数据库的事情,我建议你为它创建一个外部进程,并使用命名管道/套接字与它进行通信。
答案 1 :(得分:1)
显然pin v.3对外部库有特殊要求,我无法理解。我降级到第v.2.8版,一切正常。