dam*_*xxx 6 linux openssl rpath ldd
我有 Ubuntu 14.04。它附带了 openssl 1.0.1f。我想安装另一个openssl版本(1.0.2)并且我想自己编译它。
我将其配置如下:
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
Run Code Online (Sandbox Code Playgroud)
安装后,当我用 检查二进制文件时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)
...
Run Code Online (Sandbox Code Playgroud)
看起来不错。但是当我检查 ldd 时libssl.so,结果是:
...
libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fac70930000)
...
Run Code Online (Sandbox Code Playgroud)
它仍然使用系统版本的libcrypto。我尝试了不同的构建方法,但结果始终保持不变。
我的问题是如何以某种方式配置构建,使其可以对共享库的所有二进制和库依赖项进行硬编码LD_LIBRARY_PATH,而无需使用 或类似的东西。
我的问题是如何以某种方式配置构建,使其可以对共享库的所有二进制和库依赖项进行硬编码
LD_LIBRARY_PATH,而无需使用 或类似的东西。
OpenSSL 支持RPATH开箱即用的 BSD 目标(但不支持其他目标)。从配置:
# 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[/]*$|);
}
Run Code Online (Sandbox Code Playgroud)
对于 OpenSSL 1.0.2,最简单的方法似乎是将其添加为CFLAG:
./config -Wl,-rpath=/usr/local/ssl/lib
Run Code Online (Sandbox Code Playgroud)
对于 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",
Run Code Online (Sandbox Code Playgroud)
上面,字段 2 和 6 已更改。它们对应于$cflagOpenSSL$ldflag的构建系统。
然后,使用新配置进行配置:
$ ./Configure linux-x86_64-rpath shared no-ssl2 no-ssl3 no-comp \
--openssldir=/usr/local/ssl enable-ec_nistp_64_gcc_128
Run Code Online (Sandbox Code Playgroud)
最后,在 后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]
Run Code Online (Sandbox Code Playgroud)
一旦执行make install, thenldd将产生预期结果:
$ 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)
...
Run Code Online (Sandbox Code Playgroud)
OpenSSL 在其 wiki 上有一个编译和安装。现在已将其添加到 wiki 中的编译和安装 | 使用 RPATH