编译问题处理:undefined symbol: OPENSSL_init_crypto

时间:2024-04-04 22:14:26

编译问题处理: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后相关库仍使用原来版本,导致无法编译通过的问题);

问题分析过程:

  1. Hypervisor编译dom0 失败;
    编译问题处理:undefined symbol: OPENSSL_init_crypto
    可以看到为_hashlib 模块编译失败,则在log信息中搜索该模块,查看具体信息:
    编译问题处理:undefined symbol: OPENSSL_init_crypto

    这里可以获取到这些信息:

    1. 根据头文件和源文件编译_hashopenssl.o

    2. 在_hashopenssl.o的基础上链接 -lssl -lcrypto -lpython2.7
      这三个库生成_hashlib.so

    3. 链接过程中检测没有OPENSSL_init_crypto 符号报错

  2. 从报错信息来看应该是在链接过程中出错,则怀疑点:

    1. 依赖库的版本不对,缺少依赖的符号;

    2. 库的版本是对的,但是实际使用的与设想的不一致;

    3. 当然也不排除_hashopenssl.o存在问题导致后续异常;

  3. 逐步判断:

    1. 生成目录host-python-2.7.15/Modules/ 中没有_hashopenssl.o

    2. 生成目录host-python-2.7.15/build/lib.linux-x86_64-2.7/_hashlib.so但是有个_hashlib_fail.so

    3. 直接拷贝编译log中命令,单步执行上述两个操作,发现_hashopenssl.o 和
      _hashlib.so都可以正常生成,grep
      检索该库,确实没有OPENSSL_init_crypto符号,则问题确实是出在依赖库上;

    4. 通过ldd查看生成库的链接库位置,逐个确认版本信息:
      编译问题处理:undefined symbol: OPENSSL_init_crypto

      版本都没有问题,则是否有使用与check库不一致的情况,经过检查发现由于openssl
      原始版本为1.1.1a,后续修改为1.0.1f,但是这里使用的库的版本仍为1.1.1a的版本,而非新安装的版本,将对应旧版本库删除后可以编译通过;
      编译问题处理:undefined symbol: OPENSSL_init_crypto

总结

  1. 整体排查思路就是根据log细化到问题模块,单步执行,根据信息提示确认怀疑点,逐个确认;

  2. 排查过程中使用locate、file、ls -al、ldd等确认依赖库版本

  3. 通过make V=1等命令的使用添加打印,单步执行命令,逐步确认问题;

主要基于gcc的编译体系