![相反,解决方案是小贩将自定义库和二进制文件放入独立于默认 ld.conf 和 PATH 的隔离目录中。](https://linux22.com/image/1403384/%E7%9B%B8%E5%8F%8D%EF%BC%8C%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E6%98%AF%E5%B0%8F%E8%B4%A9%E5%B0%86%E8%87%AA%E5%AE%9A%E4%B9%89%E5%BA%93%E5%92%8C%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%E6%94%BE%E5%85%A5%E7%8B%AC%E7%AB%8B%E4%BA%8E%E9%BB%98%E8%AE%A4%20ld.conf%20%E5%92%8C%20PATH%20%E7%9A%84%E9%9A%94%E7%A6%BB%E7%9B%AE%E5%BD%95%E4%B8%AD%E3%80%82.png)
我no version information available
做的时候得到了ssh
。
Openssl 版本:
sat:~# openssl version
OpenSSL 1.0.1f 6 Jan 2014
输出如下ldd /usr/bin/ssh
:
/usr/bin/ssh: /usr/local/lib/libcrypto.so.1.0.0: no version information available (required by /usr/bin/ssh)
linux-vdso.so.1 => (0x00007fff48bff000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fdd57f1f000)
libcrypto.so.1.0.0 => /usr/local/lib/libcrypto.so.1.0.0 (0x00007fdd57b3a000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fdd57935000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fdd5771e000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007fdd57508000)
libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007fdd572c8000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdd56f3e000)
/lib64/ld-linux-x86-64.so.2 (0x00007fdd583b3000)
libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007fdd56c6a000)
libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007fdd56a40000)
libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007fdd5683c000)
libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007fdd56633000)
libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007fdd5642e000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fdd56212000)
输出locate libcrypto.so.1.0.0
:
sat:~# locate libcrypto.so.1.0.0
/usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
/usr/local/lib/libcrypto.so.1.0.0
/usr/src/openssl-1.0.1f/libcrypto.so.1.0.0
如何修复这个错误?
笔记:
我编译并安装了openssl
。之后,我ssh
通过进行安装apt-get
。
答案1
我编译并安装了openssl。之后,我通过apt-get安装了ssh。
这可能是两个不同的 OpenSSL 版本。您可能不会有任何问题,因为 1.0.0 与 1.0.1、1.0.2 等二进制兼容(但它与 1.1.0 二进制不兼容)。
您ssh
可能正在使用 中的 OpenSSL 版本/usr/lib/x86_64-linux-gnu/
。您应该使用LD_PRELOAD
来确保正在使用您的 OpenSSL 版本(当然,假设二进制兼容性)。
如果您不想使用LD_PRELOAD
和朋友,那么请ssh
从源代码构建。请务必指定rpath
以确保链接编辑器使用您的 OpenSSL 版本,而不是系统的版本。也就是说,您的LDFLAGS
应该包括类似 的内容。这是对惯用的、和 的-Wl,-rpath,<path to your openssl>
补充。-lcrypto
-lssl
-L<path to your openssl>
如果您使用的是 Mac OS X,请注意,像-Bstatic
和这样的链接器选项-rpath
会被默默忽略。由于 OS X 提供 0.9.8,您将会遇到由于二进制文件不兼容而导致的神秘崩溃。
没有可用的版本信息
至于没有版本信息,我不知道。ssh
可以OPENSSL_VERSION_NUMBER
在编译时或SSLeay
运行SSLeay_version
时使用。请参阅OPENSSL_VERSION_NUMBER(3)
了解详情。
如何修复这个错误?
也许我读错了,但我没有在帖子的任何地方看到错误。
答案2
问题:libssl.so.1.0.0
没有libcrypto.so.1.0.0
可用的版本信息警告/错误。
经过大量的研究、时间和精力(花费了数周时间),我最终完成了以下工作......
在你最终提取 openssl 1.0.1h 版本源代码的目录中(其他版本也适用)。我创建了一个名为openssl.ld
在此文件中放入这个...
OPENSSL_1.0.0 {
global:
*;
};
保存。现在输入...
make clean
(只是为了确保我们是从头开始。)
现在来看看真正令人难以置信的部分……
./config --prefix=/usr/local --openssldir=/usr/local/openssl shared -Wl,--version-script=openssl.ld -Wl,-Bsymbolic-functions
然后...
make
make test
make install
ldconfig
这样就应该可以了。(非常简单。无需修补。)
我已经将此解决方案应用于 Debian Wheezy 的 32 位和 64 位版本。并且进行了观察。64 位版本会自动默认为目录中创建的新文件libssl.so.1.0.0
和文件。32 位版本则不会。这就是为什么我最初认为 32 位版本的 Debian Wheezy 不会遇到此问题,但一旦您获得 32 位版本以使用目录中的新 openssl 库,它就会出现。libcrypto.so.1.0.0
/usr/local/lib
/usr/local/lib
使用ldd
命令来测试二进制文件正在使用的库对于解决这个问题也很有价值。
答案3
我刚刚发现,上述解决方案破坏了某些需要 OPENSSL_1.0.1 版本的二进制文件。例如 curl。apt-file 搜索将不再适用于我的解决方案,因为它使用了 curl。因此,有些二进制文件需要 1.0.0 版本,而其他二进制文件需要 1.0.1 版本。
我认为解决方案在于编辑 openssl.ld 文件。这样一些二进制文件将获得 1.0.0 版本,而其他二进制文件将获得 1.0.1 版本。目前这超出了我的能力范围。也许其他人可以解决这个问题。
答案4
如果您要安装自定义编译的库,请不要通过安装前缀/usr/local
、/usr
或 来破坏您的系统。例如,Debian/Ubuntu 将在下次调用时/
选择自定义库,因为它通常在 中列出。/usr/local/lib
ldconfig
/etc/ld.so.conf.d/libc.conf
make install
这是一个安装了openssl 1.0.2e 的一次性盒子--prefix=/usr/local
,然后运行ldconfig
(不带参数,会更新/etc/ld.so.cache
):
# ldconfig -p | egrep 'lib(crypt|ssl)'
libssl.so.1.0.0 (libc6,x86-64) => /usr/local/lib/libssl.so.1.0.0
libssl.so.1.0.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libssl.so.1.0.0
libssl.so (libc6,x86-64) => /usr/local/lib/libssl.so
libssl.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libssl.so
libcrypto.so.1.0.0 (libc6,x86-64) => /usr/local/lib/libcrypto.so.1.0.0
libcrypto.so.1.0.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
libcrypto.so (libc6,x86-64) => /usr/local/lib/libcrypto.so
libcrypto.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcrypto.so
libcrypt.so.1 (libc6,x32, OS ABI: Linux 3.4.0) => /libx32/libcrypt.so.1
libcrypt.so.1 (libc6,x86-64, OS ABI: Linux 2.6.24) => /lib/x86_64-linux-gnu/libcrypt.so.1
libcrypt.so.1 (libc6, OS ABI: Linux 2.6.24) => /lib32/libcrypt.so.1
libcrypt.so (libc6,x32, OS ABI: Linux 3.4.0) => /usr/libx32/libcrypt.so
libcrypt.so (libc6,x86-64, OS ABI: Linux 2.6.24) => /usr/lib/x86_64-linux-gnu/libcrypt.so
libcrypt.so (libc6, OS ABI: Linux 2.6.24) => /usr/lib32/libcrypt.so
注意自定义编译的库如何覆盖openssl
包中的库。
相反,解决方案是小贩将自定义库和二进制文件放入独立于默认 ld.conf 和 PATH 的隔离目录中。
安装软件到/opt/$WHATEVER-$VERSION/
然后,如果您想在中使用自定义编译的二进制文件/opt/$WHATEVER-$VERSION/bin
,附加那是PATH
(不要添加到前面,因为有破坏系统的风险)。
为了静止的将 $WHATEVER 链接到其他内容
export CFLAGS="$CFLAGS -I/opt/$WHATEVER-$VERSION/include" \
CXXFLAGS="$CXXFLAGS -I/opt/$WHATEVER-$VERSION/include" \
LDFLAGS="-lwhatever -L/opt/$WHATEVER-$VERSION/lib"
为了共享将 $WHATEVER 链接到其他内容
与上面相同但添加-Wl,-rpath,/opt/$WHATEVER-$VERSION/lib
到 LDFLAGS
另一件事是代替make install
使用checkinstall
构建一个可移动包,其中包括完整的包名,custom-$WHATEVER-$VERSION
以便于版本管理,避免通过不兼容的升级破坏自定义包。