当使用本地openssl-1.0.1f共享安装编译python-3.4.0rc3时,make没有打印错误,但随后在make install或make test上得到以下核心转储:
make
Program terminated with signal 11, Segmentation fault. (gdb) bt #0 0x00007f131dd10510 in EVP_PKEY_CTX_dup () from /data2/soft/openssl/lib/libcrypto.so.1.0.0 #1 0x00007f131dd0284f in EVP_MD_CTX_copy_ex () from /data2/soft/openssl/lib/libcrypto.so.1.0.0 #2 0x00007f131e256ab5 in EVPnew (name_obj=0x7f131e46a500, digest=0x0, initial_ctx=0x7f131e459a40, cp=0x0, len=0) at /data2/soft/python3/Python-3.4.0rc3/Modules/_hashopenssl.c:410 #3 0x00007f131e25726e in EVP_new_md5 (self=<value optimized out>, args=<value optimized out>) at /data2/soft/python3/Python-3.4.0rc3/Modules/_hashopenssl.c:799 #4 0x00000000004c7eef in ?? ()
这是使用的命令的完整列表
tar -axf Python-3.4.0rc3.tgz cd Python-3* # For lzma and a pip-compatible openssl export CFLAGS='-I/data2/soft/openssl/include/openssl -I/data2/local/include/' export LDFLAGS='-L/data2/soft/openssl/lib -L/data2/local/lib/' export LD_LIBRARY_PATH="/data2/soft/openssl/lib:/data2/local/lib/:$LD_LIBRARY_PATH" # Ready ! ./configure --prefix=/data2/soft/python3 make make install
笔记:
./config shared --openssldir=/data2/soft/openssl
make test
71 tests OK. tests failed: test_cmd_line test_gdb test_smtpnet test_ssl
如何解决这个问题,或者至少调查正在发生的事情?
编辑1–5:
共享库正确生成:
> ls /data2/soft/openssl/lib drwxr-xr-x engines -rw-r--r-- libcrypto.a lrwxrwxrwx libcrypto.so -> libcrypto.so.1.0.0 -r-xr-xr-x libcrypto.so.1.0.0 -rw-r--r-- libssl.a lrwxrwxrwx libssl.so -> libssl.so.1.0.0 -r-xr-xr-x libssl.so.1.0.0 drwxr-xr-x pkgconfig
所以我在安装程序中更改了此设置:
SSL=/data2/soft/openssl/ _ssl _ssl.c \ -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \ $(SSL)/lib/libssl.a $(SSL)/lib/libcrypto.a -ldl
然后,我相应地改回了LDFLAGS / CFLAGS。但是由于_hashopen模块,当我运行make clean && make时仍然存在-lssl:
gcc -pthread -shared -L/data2/local/lib/ -L/data2/local/lib/ -L/data2/local/lib/ -I/data2/local/include/ build/temp.linux-x86_64-3.4/data2/soft/python3/Python-3.4.0rc3/Modules/_hashopenssl.o -L/data2/local/lib/ -L/usr/local/lib -lssl -lcrypto -o build/lib.linux-x86_64-3.4/_hashlib.cpython-34m.so
我猜这是引起内核的原因,因为它们仍然存在…我尝试向安装文件中添加类似的内容,但是对此没有任何评论,创建它会导致另一个更加神秘的失败:
gcc -pthread -Xlinker -export-dynamic -o python Modules/python.o libpython3.4m.a -lpthread -ldl -lutil /data2/eoubrayrie/soft/openssl/lib/libssl.a /data2/eoubrayrie/soft/openssl/lib/libcrypto.a -ldl /data2/eoubrayrie/soft/openssl/lib/libssl.a /data2/eoubrayrie/soft/openssl/lib/libcrypto.a -ldl -lm libpython3.4m.a(config.o):(.data+0x158): undefined reference to `PyInit__hashopenssl' collect2: ld returned 1 exit status
编辑6:
ldd build/lib.linux-x86_64-3.4/_hashlib.cpython-34m.so libssl.so.1.0.0 => /data2/soft/openssl/lib/libssl.so.1.0.0 (0x00007f5605799000) libcrypto.so.1.0.0 => /data2/soft/openssl/lib/libcrypto.so.1.0.0 (0x00007f56053bd000)
info shared
From To Syms Read Shared Object Library 0x00007ffff5465930 0x00007ffff5466e98 Yes /data2/soft/python3/Python-3.4.0rc3/build/lib.linux-x86_64-3.4/_hashlib.cpython-34m.so 0x00007ffff5321220 0x00007ffff5351878 Yes /opt/python-2.6-64/lib/libssl.so.1.0.0 0x00007ffff50d3100 0x00007ffff519b118 Yes /opt/python-2.6-64/lib/libcrypto.so.1.0.0
* `env | grep -F 'python-2.6-64'` ->什么也没显示! * `grep -RF 'python-2.6-64' /etc/ld.so.*` ->同上 * `gcc -print-search-dirs | sed 's/:/\n/g' | grep python` ->同上 * `find . -name '*.so*' | xargs ldd | grep ssl` ->只给我好的 * 1级依赖项也不需要任何错误的ssl版本。对此进行了检查:
find . -name '*.so*' | xargs ldd | awk '/\t+[[:alnum:].]+ => [[:alnum:]./]+ \(/ {print $3}' | sort | uniq | xargs ldd | grep ssl
* `strace ./python ./Tools/scripts/run_tests.py 2>&1 | grep python-2.6-64` ->什么也没显示
那么,ld如果他不知道该如何选择这个错误的库呢?它不在任何标准位置(如果在/ lib中,我可以理解…)
ld
解:
感谢此OpenOffice错误,找到了如何静态链接_hashlib的方法:尽管该-Wl, --exclude-libs=ALL"选项也不起作用,但它使我指向setup.py中的正确行。
-Wl, --exclude-libs=ALL"
TL; DR这是 我应用的setup.py的补丁。
最后…有效!
@noloader我接受您最完整的答案,因为您的帮助非常宝贵,尽管遇到此问题的任何人的“确切”答案都是使用上面的补丁进行编译。
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你实际上是加载。
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
ldd /data2/soft/python3/python
libcrypto.so.1.0.0
otool -L
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) ...
作为解决方法,您可以尝试添加rpath:
LDFLAGS='-L/data2/soft/openssl/lib -L/data2/local/lib/ -Wl,-rpath,/data2/soft/openssl/lib'
更好的解决方法是链接到OpenSSL库的静态版本,以避免所有这些问题。我相信你可以做到这一点:-Bstatic -lssl -lcrypto -Bdynamic -ldl。
-Bstatic -lssl -lcrypto -Bdynamic -ldl
就个人而言,-Bstatic由于不同的一次性问题,我什至不使用。我打开Makefile,删除的所有实例-lssl -lcrypto,并向归档文件添加完整路径以消除所有歧义。例如/data2/soft/openssl/lib/libssl.a和/data2/soft/openssl/lib/libcrypto.a。
-Bstatic
-lssl
-lcrypto
/data2/soft/openssl/lib/libssl.a
/data2/soft/openssl/lib/libcrypto.a
请注意 :rpathMac OS X上不支持an。MacOS X需要采取更多极端措施,因为链接器也不支持-Bstatic。您必须使用完整路径技巧。
openssl was built with ./config shared --openssldir=/data2/soft/openssl
另一件事…在Fedora上,还不足以指定shared。您还需要添加以下内容:
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版本来修复它。
libevent