How can I fix this, or at least investigate what is going on ?
...
export LDFLAGS='-L/data2/soft/openssl/lib -L/data2/local/lib/'
export LD_LIBRARY_PATH="/data2/soft/openssl/lib:/data2/local/lib/
我也经常遇到这些问题,因为我避免了Debian,Ubuntu,Fedora等发行的残废版本的OpenSSL。例如,Ubuntu附带了一个禁用TLSv1.1和TLS v1.2的OpenSSL(请参阅Ubuntu 12.04 LTS:OpenSSL降级版本,不支持TLS 1.2)。
您可能加载了错误版本的OpenSSL库。如果你能在调试器下得到了行为不端的程序,问题info shared
,看看哪个libcrypto
和libssl
你实际上是加载。
ldd
可能也有帮助。在Pyhton可执行文件上运行它ldd /data2/soft/python3/python
。我只能说它“可能”有所帮助,因为OpenSSL是二进制兼容的,因此您可能只会看到对它的依赖libcrypto.so.1.0.0
(例如,otool -L
在Mac OS X上使用)。在下面,我使用rpath
强制链接到中的库/usr/local/ssl/lib/
。
$ ldd my-test.exe
linux-vdso.so.1 => (0x00007fffd61ff000)
libssl.so.1.0.0 => /usr/local/ssl/lib/libssl.so.1.0.0 (0x00007f151528e000)
libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007f1514e74000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1514c42000)
...
LDFLAGS='-L/data2/soft/openssl/lib -L/data2/local/lib/ -Wl,-rpath,/data2/soft/openssl/lib'
更好的解决方法是链接到OpenSSL库的静态版本,以避免所有这些问题。我相信你可以做到这一点:-Bstatic -lssl -lcrypto -Bdynamic -ldl
。
就个人而言,-Bstatic
由于不同的一次性问题,我什至不使用。我打开Makefile,删除的所有实例-lssl
-lcrypto
,并向归档文件添加完整路径以消除所有歧义。例如/data2/soft/openssl/lib/libssl.a
和/data2/soft/openssl/lib/libcrypto.a
。
请注意 :rpath
Mac OS X上不支持an。MacOS X需要采取??更多极端措施,因为链接器也不支持-Bstatic
。您必须使用完整路径技巧。
openssl was built with ./config shared --openssldir=/data2/soft/openssl
另一件事…在Fedora上,还不足以指定shared
。您还需要添加以下内容:
export CFLAGS="-fPIC"
否则,将不会构建共享库。如果未构建1.0.1f共享库,则可能是发行版提供的下层版本。您可以使用以下命令检查 在 安装 之前 构建的内容:
./config shared --openssldir=/data2/soft/openssl
make all
# Verify artifacts
find . -iname -libcrypto.*
find . -iname -libssl.*
# Proceed if OK
sudo make install
最后,请确保 所有 Python的依赖项也都使用您的OpenSSL版本,而不是系统的OpenSSL版本。
我最近在我的程序使用OpenSSL时遇到了这个问题;但是我的程序也使用libevent
并libevent
使用了系统版本的OpenSSL。我通过重建libevent
并强制将其静态链接到我的OpenSSL版本来修复它。