gpt4 book ai didi

c - 在我自己的过程中找到一个符号

转载 作者:太空狗 更新时间:2023-10-29 11:09:33 25 4
gpt4 key购买 nike

这是设置:

  1. 有一个应用程序 A 加载了 liba.so(在编译时链接)
  2. liba.so 导出一个符号 expA
  3. 我不控制 Aliba.so
  4. 应用程序 A 可以通过 dlopen(考虑插件架构)将我指定的库 libmine.so 加载到同一进程中
  5. 我需要使用 libmine.so 中的 expA,但不知道如何在不显式链接到 liba.so 的情况下找到它,这是我到目前为止一直在做的。我认为这在现实世界中行不通,因为不能保证该符号与我本地 liba.so 副本中的地址相同(或者是吗?)。 libmine.so 将是闭源的,不能用A 重新编译。

我从来没有做过这样的事情,所以对库加载的细节有点不清楚。例如,如果我尝试从 libmine.so 中执行 dlopen("liba.so"),我会得到已加载库的句柄还是新副本?

关于 libmine.so 的加载方式,我所知道的是它会加载 RTLD_LAZY(除此之外别无其他)。

如有任何帮助和指点,我们将不胜感激!

最佳答案

如果所有 liba.so 库都是使用 RTLD_GLOBAL dlopened 的,那么您可以使用 dlsym(RTLD_DEFAULT, "expA ") 无需重新打开库即可找到符号。

如果 liba.so 库是使用 RTLD_LOCAL dlopened 的,那么您将需要使用 获取库的句柄在你自己的 libmine.so 中再次 dlopen。请注意以下几点:

If the same library is loaded again with dlopen(), the same file handle is returned. The dl library maintains reference counts for library handles, so a dynamic library is not deallocated until dlclose() has been called on it as many times as dlopen() has succeeded on it. The _init() routine, if present, is only called once. But a subsequent call with RTLD_NOW may force symbol resolution for a library earlier loaded with RTLD_LAZY.

即这是库的相同副本。

该机制是(伪),假设 expA 是一个函数:int expA(int value):

int (*fpointer)(int) = NULL;

void *handle = dlopen("liba.so", RTLD_LAZY | RTLD_LOCAL);
if (handle != NULL) {
void *symbol = dlsym(handle, "expA");
if (symbol != NULL) {
fpointer = (int (*)(int ))symbol;
}
}

这是伪代码,几乎没有错误处理。

关于c - 在我自己的过程中找到一个符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18811446/

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