相反,解决方案是小贩将自定义库和二进制文件放入独立于默认 ld.conf 和 PATH 的隔离目录中。

相反,解决方案是小贩将自定义库和二进制文件放入独立于默认 ld.conf 和 PATH 的隔离目录中。

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/libldconfig/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以便于版本管理,避免通过不兼容的升级破坏自定义包。

相关内容