【发布时间】:2019-03-30 19:15:12
【问题描述】:
流程中的动态对象来自多个来源:
- 可执行文件本身
- 它需要的任何库(
DT_NEEDED用于 ELF) - 明确加载的库(
dlopen或类似) - 此类显式加载所需的任何库
当进程exits 运行它们的终结(atexit 函数,静态持续时间析构函数时,它们可以被显式(dlclose)或隐式卸载在 C++ 和 __attribute__((destructor)) 函数中)在任何一种情况下。
在这些不同的情况下,是什么决定了动态对象的初始化和最终确定顺序?显然,库的最后一个dlclose 会立即卸载它,但是它的依赖树呢(其中一些也可能是其他加载库的依赖)?如果一个库是 dlopened 但随后被 exit 卸载怎么办?
我倾向于期待通常的 reverse 初始化顺序,但 DT_NEEDED 和 dlopen 之间可能存在差异,因为“插件”由后者加载并且可能依赖于可执行文件的数据,而不是相反。
【问题讨论】:
标签: shared-libraries destructor exit dlopen