使用自定义openssl版本编译python时的Coredump

埃迪吉克

当使用本地openssl-1.0.1f共享安装编译python-3.4.0rc3时,make没有打印错误,但随后在make install或make test上得到以下核心转储:

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

笔记:

  • 操作系统是SUSE Linux Enterprise Server 11(x86_64)
  • 将python指向位于以下位置的lzma库的自定义位置
  • openssl建于 ./config shared --openssldir=/data2/soft/openssl
  • opensslmake test打印所有成功的测试。
  • 没有自定义的openssl * FLAGS,make安装成功,我得到以下结果进行make测试: 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:

  • 无论如何我都找不到修改_hashlib.so生成方式的方法,因为其中涉及太多的Makefile魔术(它不会出现在任何地方,'-lssl'也不会魔术地同时出现在同一行上
  • 但是我可以通过旧的-I / -L将其动态链接到我自己的openssl:

    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)

  • 现在唯一的问题是,gdbinfo 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中,我可以理解...)

解:

感谢此OpenOffice错误,找到了如何静态链接_hashlib :尽管该-Wl,--exclude-libs=ALL"选项也不起作用,但它使我指向setup.py中的正确行。

TL; DR这是我应用的setup.py补丁

最后...有效!

@noloader我接受您最完整的答案,因为您的帮助非常宝贵,尽管遇到此问题的任何人的“确切”答案都是使用上面的补丁进行编译。

w
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,看看哪个libcryptolibssl你实际上是加载。

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)
    ...

作为解决方法,您可以尝试添加rpath

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

请注意rpathMac 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时遇到了这个问题;但是我的程序也使用libeventlibevent使用了系统版本的OpenSSL。我通过重建libevent并强制将其静态链接到我的OpenSSL版本来修复它

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用自定义的openssl版本编译python时的Coredump

来自分类Dev

如何使用自定义OpenSSL编译Python 3.4?

来自分类Dev

自定义编译时检查

来自分类Dev

使用自定义OpenSSL构建OpenVPN

来自分类Dev

在共享服务器上使用自定义编译的Apache编译Subversion时出错

来自分类Dev

在打开文件时使用cxFreeze编译的python可执行文件打开自定义文件类型

来自分类Dev

使用GruntJS自定义CoffeeScript编译

来自分类Dev

使用GruntJS自定义CoffeeScript编译

来自分类Dev

链接到自定义sqlite3时,使用pyenv构建Python 3版本

来自分类Dev

在编译时使用类型时从自定义位置加载程序集

来自分类Dev

使用自定义Python代码复制时图像损坏

来自分类Dev

使用自定义Python代码复制时图像损坏

来自分类Dev

使用自定义系统调用编译Linux内核模块时出错

来自分类Dev

是否可以在golang中使用自定义库触发编译时错误?

来自分类Dev

使用新的USB串行驱动程序编译自定义内核时出错

来自分类Dev

使用自定义tensorflow gpu op进行编译时遇到麻烦

来自分类Dev

使用较新版本的NLog时,“未找到”自定义布局渲染器

来自分类Dev

Angular CLI-如何使用ng build在构建时传递版本(自定义变量)

来自分类Dev

尝试使用GitHub中的自定义方案时发生版本错误

来自分类Dev

编译PDF时自定义错误消息

来自分类Dev

是否可以在编译时执行自定义程序?

来自分类Dev

编译用于增强精神的自定义容器时出错

来自分类Dev

编译自定义OpenDaylight API时出错

来自分类Dev

是否可以在编译时执行自定义程序?

来自分类Dev

编译自定义容器以增强精神时出错

来自分类Dev

编译 Simple 自定义标签类时出错

来自分类Dev

制作Firefox的自定义版本时遇到的问题

来自分类Dev

编译自定义指令

来自分类Dev

D:定义用于条件编译的自定义版本标识符

Related 相关文章

  1. 1

    使用自定义的openssl版本编译python时的Coredump

  2. 2

    如何使用自定义OpenSSL编译Python 3.4?

  3. 3

    自定义编译时检查

  4. 4

    使用自定义OpenSSL构建OpenVPN

  5. 5

    在共享服务器上使用自定义编译的Apache编译Subversion时出错

  6. 6

    在打开文件时使用cxFreeze编译的python可执行文件打开自定义文件类型

  7. 7

    使用GruntJS自定义CoffeeScript编译

  8. 8

    使用GruntJS自定义CoffeeScript编译

  9. 9

    链接到自定义sqlite3时,使用pyenv构建Python 3版本

  10. 10

    在编译时使用类型时从自定义位置加载程序集

  11. 11

    使用自定义Python代码复制时图像损坏

  12. 12

    使用自定义Python代码复制时图像损坏

  13. 13

    使用自定义系统调用编译Linux内核模块时出错

  14. 14

    是否可以在golang中使用自定义库触发编译时错误?

  15. 15

    使用新的USB串行驱动程序编译自定义内核时出错

  16. 16

    使用自定义tensorflow gpu op进行编译时遇到麻烦

  17. 17

    使用较新版本的NLog时,“未找到”自定义布局渲染器

  18. 18

    Angular CLI-如何使用ng build在构建时传递版本(自定义变量)

  19. 19

    尝试使用GitHub中的自定义方案时发生版本错误

  20. 20

    编译PDF时自定义错误消息

  21. 21

    是否可以在编译时执行自定义程序?

  22. 22

    编译用于增强精神的自定义容器时出错

  23. 23

    编译自定义OpenDaylight API时出错

  24. 24

    是否可以在编译时执行自定义程序?

  25. 25

    编译自定义容器以增强精神时出错

  26. 26

    编译 Simple 自定义标签类时出错

  27. 27

    制作Firefox的自定义版本时遇到的问题

  28. 28

    编译自定义指令

  29. 29

    D:定义用于条件编译的自定义版本标识符

热门标签

归档