简而言之,按照自己的需求,在 linux 中,将 sqlcipher 编译成不依赖系统环境的二进制文件,源码编译出来的是动态库,需要依赖系统环境,这样会导致一个问题:
clang: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by clang)
google 了下,看到该问是由于编译环境的 gcc 版本高于运行环境的 gcc 版本,解决方案大概有以下两种:
1. 修改生成的可执行文件,并且在执行的时候动态依赖改写的 memcpy 库;
2.在源码编译的时候指定 memcpy 的版本,需要修改 configure 和 makefile.in 文件
按照顺序来吧,先说第一种解决方案,请参考:
http://www.lightofdawn.org/wiki/wiki.cgi/NewAppsOnOldGlibc
http://www.jianshu.com/p/308a4e803c81
第二篇基本上是第一篇的翻译简洁版,修改二进制文件的方式与第一篇有所不同,英文好的童鞋可以直接看英文的,很详细,说下我解决的过程,主要分为三步:
1)查看编译后的 sqlcipher 可执行文件的版本信息:
readelf -V /path/sqlcipher
2) 更改依赖:
for addr in 0x2f18; do printf '\\x02' | dd conv=notrunc of=/home/users/kinva/tools/lib/python2.7/site-packages/annoy/annoylib.so bs=1 seek=$((addr));
3) 将 memcpy.c 编译成 memcpy.o 文件,在执行 sqlcipher 时候,动态依赖:
LD_PRELOAD=./libs/memcpy.o ./sqlcipher test.db
到此为止,第一种方案就大功告成了。
再来说说第二种方案吧,请参考:
http://m.blog.csdn.net/nullzhou/article/details/51123435
原来基本上差不多,都是修改依赖,提供依赖函数,姑且也分为三步:
1.编写 memcpy.c 文件;
2.修改 makefile.in 文件:
TLIBS = @LIBS@ -L./libs -static $(LIBS)
-o $@ $(TOP)/src/shell.c $(TOP)/src/memcpy.c libsqlcipher.la \
其中 ./libs 为 libcrypto.a 的位置
3.修改 configure:
CFLAGS="$CFLAGS -Wl,-wrap,memcpy"
其中 memcpy 为添加的 memcpy.c 的名字
编译选项:方案1,2都相同:
./configure --disable-shared --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="./libs/libcrypto.a"
接下来可以编译了,完美解决。