Linux 如何从进程中卸载所有依赖的共享库?

Linux 如何从进程中卸载所有依赖的共享库?,linux,dynamic-linking,shared-libraries,Linux,Dynamic Linking,Shared Libraries,我已经创建了一个共享库libA.so,以便使用dlopen()动态加载到进程中。 libA.so还链接到其他共享库libB.so和libC.so。 因此,当我使用dlopen()加载libA.So时,依赖共享库libB.So和libC.So也会加载到进程中 我可以看到使用命令cat/proc/PID/maps将libA.so、libB.so和libC.so库加载到进程中 在使用dlclose()卸载libA.so期间,将从进程中卸载库libA.so。但不会从进程中卸载库libB.so和libC.

我已经创建了一个共享库libA.so,以便使用dlopen()动态加载到进程中。 libA.so还链接到其他共享库libB.so和libC.so。 因此,当我使用dlopen()加载libA.So时,依赖共享库libB.So和libC.So也会加载到进程中

我可以看到使用命令cat/proc/PID/maps将libA.so、libB.so和libC.so库加载到进程中

在使用dlclose()卸载libA.so期间,将从进程中卸载库libA.so。但不会从进程中卸载库libB.so和libC.so

从cat/proc/PID/maps中,我可以看到libA.so已卸载,但libB.so和libC.so仍然存在

如何从进程中卸载相关共享库libB.so和libC.so

如何从进程中卸载相关共享库libB.so和libC.so

您首先需要了解,当您
dlclose
libA.so
时,为什么不卸载这些库

有几个可能的原因:

  • 其中一个或两个库可以标记为
    NODELETE
    标志
  • 其中一个或两个库可能使用了它们的符号
  • 要检查#1,请执行以下操作:

    readelf -d libB.so libC.so | grep NODELETE
    
    如果这导致非空输出,则动态加载程序已被告知不要卸载库,并且您无能为力

    检查#2更难。一种可能发生#2的方式是,例如,
    libB.so
    初始值设定项使用
    atexit
    libB.so
    注册函数。如果允许卸载库,则
    atexit
    保留的函数指针将悬空,调用
    exit
    将崩溃


    使用GLIBC时,您可以要求加载程序使用
    LD_DEBUG=bindings./a.out
    打印符号分辨率信息。这将产生大量的输出,这将使您能够从例如
    libB.so
    中找出要绑定的符号。这可能足以猜测为什么
    libB.so
    不能卸载。

    你不能。回收内存是内核的工作,而不是你的。似乎是答案的种子;“不”/“你不能”是一个有效的答案,伊姆霍。