用RPATHbuild立OpenSSL?

我有Ubuntu 14.04。 它带有openssl 1.0.1f。 我想安装另一个openssl版本(1.0.2),我想自己编译它。

我configuration它如下:

LDFLAGS='-Wl,--export-dynamic -L/home/myhome/programs/openssl/i/lib -L/home/myhome/programs/zlib/i/lib' CPPFLAGS='-I/home/myhome/programs/openssl/i/include -I/home/myhome/programs/zlib/i/include' ./config --prefix=/home/myhome/programs/openssl/i \ zlib-dynamic shared --with-zlib-lib=/home/myhome/programs/zlib/i/lib \ --with-zlib-include=/home/myhome/programs/zlib/i/include make make install 

安装完成后,当我用ldd openssl检查二进制文件时,结果是:

 ... libssl.so.1.0.0 => /home/myhome/programs/openssl/i/lib/libssl.so.1.0.0 (0x00007f91138c0000) libcrypto.so.1.0.0 => /home/myhome/programs/openssl/i/lib/libcrypto.so.1.0.0 (0x00007f9113479000) ... 

看起来不错 但是当我检查ldd libssl.so ,结果是:

 ... libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fac70930000) ... 

它仍然使用libcrypto的系统版本。 我尝试了不同的方法来构build,但结果始终保持不变。

我的问题是如何configuration构build的方式,它可以硬编码共享库的所有二进制和库依赖关系,而不使用LD_LIBRARY_PATH ,或类似的东西。

Solutions Collecting From Web of "用RPATHbuild立OpenSSL?"

我的问题是如何配置构建的方式,它可以硬编码共享库的所有二进制和库依赖关系,而不使用LD_LIBRARY_PATH ,或类似的东西。

OpenSSL支持BSD目标(而不是其他)的RPATH 。 从配置:

 # Unlike other OSes (like Solaris, Linux, Tru64, IRIX) BSD run-time # linkers (tested OpenBSD, NetBSD and FreeBSD) "demand" RPATH set on # .so objects. Apparently application RPATH is not global and does # not apply to .so linked with other .so. Problem manifests itself # when libssl.so fails to load libcrypto.so. One can argue that we # should engrave this into Makefile.shared rules or into BSD-* config # lines above. Meanwhile let's try to be cautious and pass -rpath to # linker only when --prefix is not /usr. if ($target =~ /^BSD\-/) { $shared_ldflag.=" -Wl,-rpath,\$(LIBRPATH)" if ($prefix !~ m|^/usr[/]*$|); } 

对于OpenSSL 1.0.2来说,最简单的方法似乎是将其添加为CFLAG

 ./config -Wl,-rpath=/usr/local/ssl/lib 

下一个最简单的OpenSSL 1.0.2的方法似乎是添加一个配置行,并且对rpath硬编码。 例如,我正在使用Debian x86_64。 所以我在编辑器中打开了Configure文件,复制了linux-x86_64 ,命名为linux-x86_64-rpath ,并进行了以下更改以添加-rpath选项:

 "linux-x86_64-rpath", "gcc:-m64 -DL_ENDIAN -O3 -Wall -Wl,-rpath=/usr/local/ssl/lib:: -D_REENTRANT::-Wl,-rpath=/usr/local/ssl/lib -ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL: ${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64", 

以上,第2和第6场被更换。 它们对应于OpenSSL构建系统中的$cflag$ldflag

然后,使用新配置进行配置:

 $ ./Configure linux-x86_64-rpath shared no-ssl2 no-ssl3 no-comp \ --openssldir=/usr/local/ssl enable-ec_nistp_64_gcc_128 

最后在make之后,确认设置卡住了:

 $ readelf -d ./libssl.so | grep -i rpath 0x000000000000000f (RPATH) Library rpath: [/usr/local/ssl/lib] $ readelf -d ./libcrypto.so | grep -i rpath 0x000000000000000f (RPATH) Library rpath: [/usr/local/ssl/lib] $ readelf -d ./apps/openssl | grep -i rpath 0x000000000000000f (RPATH) Library rpath: [/usr/local/ssl/lib] 

一旦你执行make install ,那么ldd会产生预期的结果:

 $ ldd /usr/local/ssl/lib/libssl.so linux-vdso.so.1 => (0x00007ffceff6c000) libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007ff5eff96000) ... $ ldd /usr/local/ssl/bin/openssl linux-vdso.so.1 => (0x00007ffc30d3a000) libssl.so.1.0.0 => /usr/local/ssl/lib/libssl.so.1.0.0 (0x00007f9e8372e000) libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007f9e832c0000) ... 

OpenSSL在其wiki上有编译和安装 。 这已经被添加到编译和安装维基| 使用RPATHs