背景:因为业务需要之前升级过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.1w、openssl-1.1.1k、openssl-1.1.1、openssl-1.1.0l、openssl-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 命令可以正常执行了。
最后思考:解决该问题,当中做不同版本的尝试花费了不少时间的;但是不同版本的尝试过程当中,多少有点盲目尝试的感觉,到了最后查找符号定义的时候,才回到了快速定位问题的轨迹上;