使用自己制定的openssl

若程序需要调用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

编译时,不是用-lssl,而是指定so的path。可以用-Iobjs/openssl-1.0.1c/include来指定包含的头文件。

这时候,查看程序的依赖,是指向系统的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修改so的搜索路径

编译工具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。




你可能感兴趣的:(使用自己制定的openssl)