解决 version OPENSSL_1.0.0
not found 报错问题
情况问题如下
./starbound: /usr/lib32/libcrypto.so.1.1: version `OPENSSL_1.0.0' not found (required by ./starbound)
问题原因解析
发生原因现在来解释一下(感谢链接1帮了我理解了这个)
Starbound
这个程序需要用到 libcrypto
这个动态库,然后这个动态库使用 OPENSSL
的某些符号版本。但是程序里面用到的是 OPENSSL_1.0.0
符号版本,而 libcrypto
这个动态库没有这个 OPENSSL_1.0.0
问题原因确认
-
首先来看
starbound
使用了libcrypto
allen@allen> ldd starbound 1 ./starbound: /usr/lib32/libcrypto.so.1.1: version `OPENSSL_1.0.0' not found (required by ./starbound) linux-gate.so.1 (0xf7edb000) /usr/lib32/libcrypto.so.1.1 (0xf7c24000) libc.so.6 => /usr/lib32/libc.so.6 (0xf7a08000) libdl.so.2 => /usr/lib32/libdl.so.2 (0xf7a02000) libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf79df000) /lib/ld-linux.so.2 => /usr/lib/ld-linux.so.2 (0xf7edd000)
-
确认
starbound
需要使用OPENSSL_1.0.0
allen@allen> strings starbound | grep OPENSSL OPENSSL_1.0.0 MD5_Init@@OPENSSL_1.0.0 MD5_Update@@OPENSSL_1.0.0 MD5_Final@@OPENSSL_1.0.0
-
确认
libcryto
没有OPENSSL_1.0.0
allen@allen > strings /usr/lib32/libcrypto.so.1.1 | grep OPENSSL_1 OPENSSL_1_1_0 OPENSSL_1_1_0a OPENSSL_1_1_0c OPENSSL_1_1_0d OPENSSL_1_1_0f OPENSSL_1_1_0g OPENSSL_1_1_0h OPENSSL_1_1_0i OPENSSL_1_1_0j OPENSSL_1_1_1
问题解决方案
- 方案一: 我系统的
openssl
版本是1.1.2, 重新编译openssl
,编译时候需要加上1.0.0的符号版本。 - 方案二: 编译
openssl
的1.0.0版本,但不把他作为系统的版本。仅仅让starbound
使用这个1.0.0版本即可。
我用了方案二,方案一编译加上符号版本好像有点问题,但我先写下来,以后再说吧。
方案一
1. 去官网下载,解压
2. 创建一个链接脚本文件,添加OPENSSL_1.0.0的信息。
cat > openssl.ld << EOF
OPENSSL_1.0.0 {
global:
*;
};
OPENSSL_1.0.1 {
global:
*;
};
OPENSSL_1.0.1_EC {
global:
*;
};
OPENSSL_1.0.2 {
global:
*;
};
EOF
3. 使用config的时候需要附加上刚才创建的链接脚本文件,该文件可使编译后生成的动态库文件中包含该版本信息
./config --prefix=(下载OPENSSL的目录) --openssldir=(你想要安装到的目录) shared -Wl,--version-script=openssl.ld -Wl,-Bsymbolic-functions
4. 编译
make -j4
5. 编译结束后,会生成一个libcrypto.so.1.0.0动态库文件,查看它是否包含“OPENSSL_1.0.0”信息
strings libcrypto.so.1.0.0 | grep OPENSSL_1
OPENSSL_1.0.0
OPENSSL_1.0.1
OPENSSL_1.0.1_EC
OPENSSL_1.0.2
OPENSSL_1.0.1
OPENSSL_1.0.1_EC
OPENSSL_1.0.0
OPENSSL_1.0.2
6. 已经包含该版本,可以单独将libcrypto.so.1.0.0文件放置到系统库目录下了。
cp libcrypto.so.1.0.0 /usr/lib64/
7. 如果只是需要该so库的话,就不一定非要执行"make install"操作了
方案二
1. 去官网下载旧版本,解压
2. 假设我下载的是 /home/linux/openssl-1.0.0,那么接下的命令如下
# 编译32位(starbound是32位程序)
setarch i386 ./config -m32 shared --prefix=/home/linux/openssl-1.0.0 --openssldir=/home/linux/openssl-1.0.0/ssl
make -j4
cd /path/to/starbound
patchelf --replace-needed /usr/lib32/libcrypto.so.1.1 ./openssl-1.0.0/libcrypto.so.1.0.0 starbound
参考文章
1. OPENSSL编译增加符号版本: http://www.khcloud.net:4082/?thread-429.htm
2. OPENSSL编译: https://blog.csdn.net/andylauren/article/details/53456340
3. OPENSSL编译32位: https://blog.csdn.net/whatday/article/details/96995767