繁体   English   中英

Linux,共享库使用主程序中的函数而不是其他共享库

[英]Linux, Shared library uses functions from main program instead of other shared libraries

我正在构建一个从应用程序加载的共享库(我无法控制)。 我的库使用其他共享库,而这些库又使用其他共享库,复杂但并不罕见。

问题是主应用程序的功能存在于链中的一个库中,更具体地说, openLDAP又使用openSSL函数:

Main app->My library->openLDAP libraries->openSSL libraries

我的猜测是主应用程序是通过静态链接或简单的源代码复制/粘贴来实现openSSL

我的问题是:我可以控制哪些功能openLDAP从我的图书馆使用或做我必须重新编译openLDAP一个静态链接到openSSL

由于安全问题, openSSL经常更新,如果我不需要,我不想要它的静态副本。 当它是大多数发行包的一部分时,为什么要重新分发openLDAP的专有副本......

现在你所拥有的是可执行文件,它会覆盖系统默认选择的OpenSSL库。 这样做是可执行的权利,你不能真正阻止它。

静态链接库中的OpenSSL可能也不是真正的解决方案。 首先,如果可执行文件真的是使用不同的版本怎么办? 另一方面,如果OpenSSL有一些全局变量怎么办? 现在,您将在同一个进程中拥有该库的两个副本,这不是一个好主意,可能会导致错误。

对我来说,我们在Linux上的最佳答案是不要将此类问题视为一个问题。 如果可执行文件加载了错误版本的OpenSSL,那不是您库的错误。 最多可以检查加载的版本,如果由于某种原因已知与您的库不兼容,则拒绝运行。

我的猜测是主应用程序是通过静态链接或简单的源代码复制/粘贴来实现openSSL。

这是错误的事情。 如果应用程序开发人员在他的脚上射击那么你就不能做任何事情。

应用程序开发人员应该看到您的库依赖于OpenSSL库(使用ldd命令),然后他不应该OpenSSL again as staticly or copy paste its code.链接OpenSSL again as staticly or copy paste its code.

如果OpenSSL中的某些函数没有创建任何混乱,并且如果它们可以像任何java类的任何静态方法一样使用,那么只有App开发人员应该承担在app中实现该代码的风险。

解决方案是在dlopen(3)中使用RTLD_DEEPBIND:

RTLD_DEEPBIND(自glibc 2.3.4起)

将符号的查找范围放在此库的全局范围之前。 这意味着一个独立的库将使用自己的符号而不是全局符号,这些符号包含在已经加载的库中。 POSIX.1-2001中未指定此标志。

这可能不是最好的解决方案,但在这种情况下,当流程由封闭源软件创建时,它可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM