我正在构建一个从应用程序(我无法控制)加载的共享库。我的库使用其他共享库,而这些共享库又使用其他共享库,复杂但并不罕见。
问题是主应用程序的功能存在于链中更下游的库之一中,更具体地说是 openLDAP
反过来使用 openSSL
功能:
Main app->My library->openLDAP libraries->openSSL libraries
我的猜测是主应用程序正在通过静态链接或简单的源代码复制/粘贴来实现 openSSL
。
我的问题是:我可以控制 openLDAP
从我的库中使用哪些函数,还是我必须重新编译 openLDAP
并静态链接到 openSSL
?
由于安全问题,openSSL
更新得相当频繁,如果不需要的话,我不想要它的静态拷贝。为什么要重新分发 openLDAP
的专有拷贝,因为它是大多数分发包的一部分......
最佳答案
现在您拥有的是覆盖系统默认选择 OpenSSL 库的可执行文件。这样做是在可执行文件的权限范围内,您无法真正阻止它。
在您的库中静态链接 OpenSSL 可能也不是真正的解决方案。一方面,如果可执行文件确实使用不同的版本怎么办?另一方面,如果 OpenSSL 有一些全局变量怎么办?现在您将在同一个进程中拥有库的两个拷贝,这不是一个好主意,并且可能会导致错误。
对我来说,我们在 Linux 上的最佳答案是不要将此类事情视为问题。如果可执行文件加载了错误版本的 OpenSSL,那不是您的库的错。您最多可以检查加载了哪个版本,如果已知它由于某种原因与您的库不兼容则拒绝运行。
关于c++ - Linux,共享库使用主程序中的函数而不是其他共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26271777/