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
从我的库中使用哪些函数吗?还是必须通过与openSSL
的静态链接重新编译openLDAP
?
由于openSSL
由于安全问题而频繁更新,如果不必要的话,我不想要它的静态副本。既然openLDAP
是大多数分发包的一部分,为什么要重新分发它的专有副本呢。。。
现在您所拥有的是可执行文件,它覆盖了系统默认选择的OpenSSL库。这在可执行文件的权限范围内,你无法真正阻止它
静态链接库中的OpenSSL可能也不是真正的解决方案。首先,如果可执行文件真的使用了不同的版本,该怎么办?另一方面,如果OpenSSL有一些全局变量呢?现在,您将在同一过程中拥有库的两个副本,这不是一个好主意,可能会导致错误。
对我来说,在Linux上,最好的答案是不要把这类事情视为一个问题。如果一个可执行文件加载了一个错误版本的OpenSSL,那不是库的错。您最多可以检查加载了哪个版本,如果知道它由于某种原因与库不兼容,则拒绝运行。
我的猜测是,主应用程序正在实现openSSL通过静态链接或简单的源代码复制/粘贴。
这是错误的事情。若应用程序开发人员在他的脚上开枪,那个么你们什么都不能做。
应用程序开发人员应该看到你的库依赖于OpenSSL库(使用ldd命令),然后他不应该链接OpenSSL again as staticly or copy paste its code.
如果OpenSSL中的一些函数没有造成任何混乱,并且它们可以像任何java类的任何静态方法一样使用,那么只有应用程序开发人员才应该冒险在应用程序中实现这些代码。
解决方案是在dlopen(3):中使用RTLD_DEEPBIND
RTLD_DEEPBIND(自glibc 2.3.4起)
将此库中符号的查找范围放在全球范围。这意味着一个独立的图书馆将使用拥有的符号优先于具有相同名称的全局符号包含在已加载的库中。此标志不是POSIX.1-2001中规定。
这可能不是最好的解决方案,但在这种情况下,当流程是由封闭源代码软件创建时,它是有效的。
- 使用 pybind11 构建库,链接其他共享库
- 如何使 extern 方法在共享库中定义,但使用 cmake 在其他目标中声明?
- 如何与其他开发人员共享代码?(和命名)
- 重载流<<运算符,用于指针/共享指针和其他类型的
- 是否要确保一个线程修改的任何数据类型的共享变量对其他线程可见
- 您如何共享Java功能而不提供其他源代码
- 如何从实现与其他接口共享的接口的类继承
- 共享库依赖于具有硬编码路径的其他库
- 在C 中,可以从第三个共享对象访问其他两个不同共享对象
- 删除与其他类共享的指针
- 创建一个取决于其他共享对象的共享对象
- buildroot:仅构建一个包裹作为共享和静态lib,所有其他包装仅共享
- 创建包含其他库的共享库
- 如何与其他应用程序共享 HGLOBAL?
- 在Android中,如何在jni_onLoad方法中加载其他共享库
- Eigen3 或其他矩阵库 2D 矩阵是否可以通过共享内存从不同的进程更新
- 如何在Ruby和其他语言之间共享文本文件(或互斥/信号量)
- 建立链接到其他非标准共享库的共享库
- 如果我删除其他进程的共享内存,会发生什么
- Linux,共享库使用主程序中的函数,而不是其他共享库