我不介意编辑生成的 Makefile,这是我最后尝试的...
我不确定您是否可以使用 shell 变量和相对路径来设置它。我认为不会ldd
扩展$ORIGIN
in $ORIGIN/../lib64
。在这种情况下,我认为您需要使用添加ldconfig
到库的搜索路径。有关更多详细信息,请参阅在服务器故障上查找 ldd 搜索路径。 $ORIGIN/../lib64
由于我不确定,我还是会提供说明。您不需要更改 Makefile。事实上,过去我没有任何运气这样做,因为事情会被覆盖,而其他事情则会CFLAGS
被LDFLAGS
忽略。
另请参阅使用 RPATH 构建 OpenSSL?您的问题和引用的问题是不同的问题,它们收敛于相似的答案(它们之间没有重复)。但它提供了 OpenSSL 开发人员在 RPATH 上的位置。这是一封私人电子邮件,所以我分享了相关的细节而不是整个信息。
如果您设法嵌入$ORIGIN/../lib64
ELF 部分并且它有效,那么请报告。下面,我正在使用/usr/local/ssl/lib
我的 RPATH。你应该替换$ORIGIN/../lib64
为/usr/local/ssl/lib
.
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[/]*$|);
}
对 OpenSSL 1.0.2 执行此操作的最简单方法似乎是 在配置期间将其添加到链接器标志中
./config -Wl,-rpath=/usr/local/ssl/lib
您还可以编辑配置行并对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 已更改。它们对应于$cflag
并$ldflag
在 OpenSSL 的构建系统中。
然后,使用新配置进行配置:
$ ./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
, 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)
...