若程序需要调用openssl,但是系统的不见得就是需要的版本,这时候可以自身编译一个版本出来,然后引用当前目录的libssl.so。
所以需要在编译时指定so,并且用patchelf来修改程序查找so的目录。
并且,libssl.so本身是依赖于libcrypto.so,所以也需要修改它的路径。
第一步,编译openssl
mkdir objs cd objs wget http://www.openssl.org/source/openssl-1.0.1c.tar.gz tar xf openssl-1.0.1c.tar.gz cd openssl-1.0.1c ./config shared make
g++ -o objs/smart_server objs/openssl-1.0.1c/libcrypto.so objs/openssl-1.0.1c/libcrypto.so
这时候,查看程序的依赖,是指向系统的ssl的。
[winlin@dev6 smart-server]$ ldd objs/smart_server libssl.so.1.0.0 => /usr/lib64/libssl.so.1.0.0 (0x0000003731800000) libcrypto.so.1.0.0 => /usr/lib64/libcrypto.so.1.0.0 (0x000000372fc00000)
编译工具patchelf:
cd objs wget http://hydra.nixos.org/build/1524660/download/3/patchelf-0.6.tar.gz tar xf patchelf-0.6.tar.gz cd patchelf-0.6 ./configure make修改路径:
[winlin@dev6 smart-server]$ ./objs/patchelf-0.6/src/patchelf --set-rpath objs/openssl-1.0.1c ./objs/smart_server [winlin@dev6 smart-server]$ ldd objs/smart_server libssl.so.1.0.0 => objs/openssl-1.0.1c/libssl.so.1.0.0 (0x00007f13a9560000) libcrypto.so.1.0.0 => objs/openssl-1.0.1c/libcrypto.so.1.0.0 (0x00007f13a9185000)
注意:需要先修改libssl的路径,否则libcrypt还是会指向系统目录:
./objs/patchelf-0.6/src/patchelf --set-rpath objs/openssl-1.0.1c ./objs/openssl-1.0.1c/libcrypto.so
有时候编译也没有问题,就是运行出错,因为系统的版本是1.0.0,而我们编译的是1.0.1c,有细微的差别,可能出现某些符号没有定义。所以一定要修改libssl.so依赖的libcrypt的路径。
这样修改,不会影响系统的openssl,唯一注意的是启动程序时必须在程序所在的目录启动,否则会找不到so。