📜  dyld:惰性符号绑定失败:找不到符号:_OPENSSL_add_all_algorithms_noconf (1)

📅  最后修改于: 2023-12-03 15:00:33.416000             🧑  作者: Mango

程序员必知的 dyld 错误:惰性符号绑定失败

如果你是一名 Mac 或者 iOS 程序员,你肯定不会陌生 dyld。dyld (dynamic link editor) 是 macOS 和 iOS 中的动态链接器,用于加载和链接共享库并解析符号。

在使用 dyld 的过程中,我们时常会遇到不同的错误。其中一个比较常见的错误是:

dyld: lazy symbol binding failed: can't find symbol: _OPENSSL_add_all_algorithms_noconf

本文将带领程序员从以下几点来深入了解这个错误:

  • 错误发生的原因
  • 如何定位到问题的根源
  • 如何解决这个问题
错误发生的原因

dyld 的符号绑定可以分为两种方式:提前绑定 (eager binding) 和惰性绑定 (lazy binding)。默认情况下,dyld 会使用惰性绑定,将符号绑定延迟到第一次使用的时候。

这样做的好处是可以提高程序的启动速度,因为符号的解析被延迟到实际需要用到这些符号的时候。但是,如果某个符号无法被正确解析,就会出现类似上述的错误。

具体来说,这个错误是因为程序使用了 OPENSSL 库中的一个函数 _OPENSSL_add_all_algorithms_noconf,但是在程序运行的时候,dyld 没有找到这个函数对应的符号,导致符号绑定失败。

如何定位到问题的根源

在遇到这个问题的时候,我们首先需要做的是找到符号绑定失败的位置。为了定位到问题,我们可以使用以下两个工具:

  1. otool 命令

otool 命令可以查看二进制文件中的某个符号对应的地址。我们可以使用下面的命令来查看程序运行时使用的 OPENSSL 版本:

otool -L <binary_path>

这个命令会列出程序依赖的所有动态库,并且会显示这些动态库中包含的符号列表和对应的地址。

  1. dlopendlsym 函数

如果用 otool 命令无法解决问题,我们可以使用 dlopendlsym 函数来手动加载和解析动态库中的符号。

这些函数通常在动态库使用的时候调用,但是我们也可以手动使用它们来加载和解析某个动态库中的符号。

如何解决这个问题

如果我们定位到了问题,我们可以采取以下措施来解决它:

  1. 尝试升级 OPENSSL 版本

有些问题可能是由于 OPENSSL 版本过旧导致的。我们可以尝试升级 OPENSSL 版本来解决问题。

  1. 检查 OPENSSL 的安装位置

有些问题可能是由于 OPENSSL 安装位置不正确导致的。我们可以使用 brew info 命令来查看 OPENSSL 的安装位置,并且将动态库路径设置为正确的位置。

  1. 将 OPENSSL 库静态链接进程序中

一些程序员选择将 OPENSSL 库静态链接进程序中,这样就不需要依赖系统中存在合适版本的 OPENSSL 库了。

综上所述,当我们遇到 dyld: lazy symbol binding failed 这样的错误时,首先需要定位到错误的根源,并且采取相应的措施来解决问题。