gpt4 book ai didi

c - 加载另一个共享库的共享库

转载 作者:行者123 更新时间:2023-11-30 19:29:04 24 4
gpt4 key购买 nike

我正在开发一个更新应用程序,该应用程序必须能够在现有系统上运行,并且也可以由该现有系统上的另一个应用程序启动。

我使用的共享库本身使用 OpenSSL,但没有链接到它。之前我的更新应用程序链接到 OpenSSL 来解决这个问题。但现在由于二进制不兼容,我无法再链接 OpenSSL。现在,当我的应用程序在现有系统上启动时,我收到 undefined symbol 错误,因为 OpenSSL 未加载。请注意,我无法选择通过 LD_PRELOAD 加载它,因为我无法更改启动更新应用程序的应用程序。

我考虑过通过 dlopen 加载 OpenSSL,希望共享库能够使用它。但是共享库在 C 构造函数 (__attribute__((constructor (101))) void myConstructor()) 中使用 OpenSSL,即使我在另一个具有更高级别的构造函数中调用 dlopen优先级是,动态加载器似乎已经搜索(并失败)了 OpenSSL。我的构造函数甚至没有被执行。

LD_BIND_NOW 未设置,所以我想知道为什么在调用我的构造函数之前会发生 undefined symbol 错误。

最佳答案

我自己找到了解决方案。

问题是共享库在主应用程序之前初始化(即调用 C 构造函数)。当您设置环境变量LD_DEBUG=libs时可以看到顺序。所以我自己创建了一个共享库。我在错误库(-luggy -lfix)之后链接了这个修复库,因为粗略的初始化(我不太理解规则。)以相反的加载顺序进行。

现在我可以在修复库的 C 构造函数中加载 OpenSSL,如下所示:

void *p = dlopen("libssl.so.1.0.0", RTLD_LAZY | RTLD_GLOBAL | RTLD_NODELETE);
if(p)
dlclose(p);

标志RTLD_GLOBAL确保OpenSSL也可以被其他库使用。标志 RTLD_NODELETE 确保库不会在 dlclose 上卸载。

注意:当我的更新应用程序在具有 OpenSSL 1.1 和正确链接 OpenSSL 的共享库的较新系统上运行时,加载 libssl.so.1.0.0 将默默失败,因为旧的 OpenSSL该系统上不存在该版本(嵌入式系统,需要节省磁盘空间)。如果 OpenSSL 1.0 仍然存在,这可能是一个问题。

关于c - 加载另一个共享库的共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53303474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com