记一次/usr/lib64/python2.7/site-packages/pycurl.so: undefined symbol: CRYPTO_num_locks的修复过程

背景:因为业务需要之前升级过git,而后,因为git访问https连接时,提示错误,需要升级libcurl,所以下载了最新的curl源码进行了编译安装;编译安装后,git可以正常使用了;但是在使用yum 安装程序时,提示了

/usr/lib64/python2.7/site-packages/pycurl.so: undefined symbol: CRYPTO_num_locks

解决过程:

看到该提示后,首先进行百度进行搜索,查到了conda环境下pycurl.so: undefined symbol: CRYPTO_num_locks解决方案_conda install zlib-devel-CSDN博客

发现是替换了libcurl.so,并且将libcurl.so替换成了libcurl.so.4.3;原以为是libcurl的版本不对,所以通过下载不同的curl版本进行重新安装,以期解决该问题;

后面替换了多个curl版本后,得到的错误信息还是原来的错误信息;

因为找不到的符号是CRYPTO_num_locks,感觉这个符合应该是定义在openssl中的,所以通过下载不同的openssl版本进行了不同的尝试。

openssl官网 依次下载了openssl-1.1.1wopenssl-1.1.1kopenssl-1.1.1openssl-1.1.0lopenssl-1.1.0;进行了尝试,发现错误信息还是原来的undefined symbol: CRYPTO_num_locks;使用nm针对libcrypto.so进行符号查询,依然查找不到CRYPTO_num_locks的符号;

后通过grep在源码中进行查找,发现CRYPTO_num_locks是有定义的,但是是一个宏定义

[root@localhost openssl-1.1.1w]# grep CRYPTO_num_locks * -R
CHANGES:  *) New function "CRYPTO_num_locks" that returns CRYPTO_NUM_LOCKS.
include/openssl/crypto.h:#  define CRYPTO_num_locks()            (1)

宏定义经过编译之后,nm应该是查找不到符号的,同时也不能被外部so所使用;所以猜测在更低的版本的openssl中可能会有CRYPTO_num_locks的定义,而后继续尝试更低的openssl版本;

此次使用的是openssl 1.0.2版本,下载完代码后,对代码进行CRYPTO_num_locks查找,

[root@localhost openssl-1.0.2u]# grep CRYPTO_num_locks * -R
CHANGES:  *) New function "CRYPTO_num_locks" that returns CRYPTO_NUM_LOCKS.
crypto/cryptlib.c:int CRYPTO_num_locks(void)
crypto/crypto.h:int CRYPTO_num_locks(void);     /* return CRYPTO_NUM_LOCKS (shared libs!) */

在这个版本中,果然可以查看到CRYPTO_num_locks这个函数的定义;遂对这个版本进行编译安装,同时重新对curl进行编译安装;在过程当中,因为之前安装了较新版本的openssl,出现了libcurl没有链接到openssl 1.0.2版本的情况;这个过程当中,可以通过修改PKG_CONFIG_PATH,将openssl 1.0.2的默认安装路径/usr/local/ssl/lib/pkgconfig加入到PKG_CONFIG_PATH的查找路径中,在针对curl执行

./configure --with-ssl=/usr/local/ssl

后,确认链接库的路径为/usr/local/ssl/lib

   LDFLAGS:         -L/usr/local/ssl/lib
   LIBS:            -lssl -lcrypto -lssl -lcrypto -lz

而后执行make && make install后,再执行yum install会提示libcrypto.so.1.0.0找不到,这是因为/usr/local/ssl/lib/未加入到LD_LIBRARY_PATH当中,

export LD_LIBRARY_PATH=/usr/local/ssl/lib/:${LD_LIBRARY_PATH}
ldconfig

执行完以上命令后,yum install 命令可以正常执行了。

最后思考:解决该问题,当中做不同版本的尝试花费了不少时间的;但是不同版本的尝试过程当中,多少有点盲目尝试的感觉,到了最后查找符号定义的时候,才回到了快速定位问题的轨迹上;

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值