gpt4 book ai didi

linux - dlclose : "shared objects still referenced" 错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:52:02 24 4
gpt4 key购买 nike

我在 dlclose() 的 .so 上有以下错误:“仍然引用共享对象”。我没有找到太多关于它的信息。你以前有过这样的问题吗?什么样的编程错误(或编译选项?)会导致这种情况?

我唯一尝试的是查看我的模块是否已成功释放所有引用的共享对象,但正如我所见,它们都正常。至少希望如此。我还不能真正使用 LD_DEBUG。

最佳答案

(在问题的评论中发布重新讨论。)

以下可能在 QNX 上触发该错误/警告。我们首先需要两个共享库:

  • shared_needs.c

    /* References a function defined elsewhere. */

    void defined_elsewhere(void);

    void f(void) {
    defined_elsewhere();
    }
  • shared_has.c

    /* Has the function referenced above. */

    void defined_elsewhere(void) {}

我们按如下方式编译它们(为了简单起见省略了 sonames 和其他良好实践):

$ gcc -shared -fPIC shared_has.c -o shared_has.so
$ gcc -shared -fPIC shared_needs.c -o shared_needs.so

我们现在使用以下代码加载/卸载库 (loader.c),

#include <dlfcn.h>
#include <stdio.h>

int main(void) {
void *shared_has;

/* Pass RTLD_GLOBAL so that defined_elsewhere() becomes
available to libraries loaded later. */
shared_has = dlopen("shared_has.so", RTLD_NOW | RTLD_GLOBAL);
if (shared_has == NULL) {
fprintf(stderr, "%s\n", dlerror());
return 1;
}

/* shared_needs.so resolves defined_elsewhere() from
shared_has.so. */
if (dlopen("shared_needs.so", RTLD_NOW) == NULL) {
fprintf(stderr, "%s\n", dlerror());
return 1;
}

/* Might get warning here on QNX, since defined_elsewhere()
is still used. */
if (dlclose(shared_has) != 0) {
fprintf(stderr, "%s\n", dlerror());
return 1;
}

return 0;
}

,我们编译运行如下:

$ gcc loader.c -ldl -o loader
$ LD_LIBRARY_PATH=. ./loader

以上可能会在 QNX 上打印警告。它应该是安全的(因为它在 Linux 上),因为 dlclose() QNX 上的手册页说明如下:

An object won't be removed from the address space until all references to that object (via dlopen() or dependencies from other objects) have been closed.

作为旁注,您可以运行 objdump -T shared_needs.so看到 shared_needs.so 有一个 undefined reference defined_elsewhere() (寻找 **UND**)。

关于linux - dlclose : "shared objects still referenced" 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28882298/

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