Linux 如何从进程中卸载所有依赖的共享库?
我已经创建了一个共享库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 您首先需要了解,当您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.
dlclose
libA.so
时,为什么不卸载这些库
有几个可能的原因:
NODELETE
标志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
不能卸载。你不能。回收内存是内核的工作,而不是你的。似乎是答案的种子;“不”/“你不能”是一个有效的答案,伊姆霍。