Skip to content

『006』解决 OPENSSL_1.0.0not 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

Comments