编译问题处理:undefined symbol: OPENSSL_init_crypto
结论:
Python 2.7 编译_hashlib.so 提示undefined symbol: OPENSSL_init_crypto问题;
原因为openssl版本不匹配,所需要的symbol在该版本库中没有实现;
针对于本次问题,将openssl version 配置为1.0.1f
并将其关联库删除后重新编译,编译通过(PS:这里需要注意编译时实际使用的lib库的路径,避免出现版本安装为1.0.1f后相关库仍使用原来版本,导致无法编译通过的问题);
问题分析过程:
-
Hypervisor编译dom0 失败;
可以看到为_hashlib 模块编译失败,则在log信息中搜索该模块,查看具体信息:这里可以获取到这些信息:
-
根据头文件和源文件编译_hashopenssl.o
-
在_hashopenssl.o的基础上链接 -lssl -lcrypto -lpython2.7
这三个库生成_hashlib.so -
链接过程中检测没有OPENSSL_init_crypto 符号报错
-
-
从报错信息来看应该是在链接过程中出错,则怀疑点:
-
依赖库的版本不对,缺少依赖的符号;
-
库的版本是对的,但是实际使用的与设想的不一致;
-
当然也不排除_hashopenssl.o存在问题导致后续异常;
-
-
逐步判断:
-
生成目录host-python-2.7.15/Modules/ 中没有_hashopenssl.o
-
生成目录host-python-2.7.15/build/lib.linux-x86_64-2.7/_hashlib.so但是有个_hashlib_fail.so
-
直接拷贝编译log中命令,单步执行上述两个操作,发现_hashopenssl.o 和
_hashlib.so都可以正常生成,grep
检索该库,确实没有OPENSSL_init_crypto符号,则问题确实是出在依赖库上; -
通过ldd查看生成库的链接库位置,逐个确认版本信息:
版本都没有问题,则是否有使用与check库不一致的情况,经过检查发现由于openssl
原始版本为1.1.1a,后续修改为1.0.1f,但是这里使用的库的版本仍为1.1.1a的版本,而非新安装的版本,将对应旧版本库删除后可以编译通过;
-
总结
-
整体排查思路就是根据log细化到问题模块,单步执行,根据信息提示确认怀疑点,逐个确认;
-
排查过程中使用locate、file、ls -al、ldd等确认依赖库版本
-
通过make V=1等命令的使用添加打印,单步执行命令,逐步确认问题;
主要基于gcc的编译体系