从多个库动态加载时静态存储持续时间对象的唯一性保证

Static-storage-duration object uniquness guaranties when dynamically loaded from multiple libraries

假设有一个共享库 S,有共享库 AB,还有一个可执行文件 CAB 链接到 SC 未链接到 AB,而是 C 通过 dlopen 动态加载 ABS 有一个带有外部链接的静态存储持续时间对象 O,在 AB.

中使用

我知道链接器通过外部链接保证静态对象的唯一性,例如,如果 C 将链接到 AB,那么 O将是唯一的,但我不确定动态库加载。

动态加载库 AB 会共享对象 O 的同一内存,还是两个单独分配的对象 O?如果共享对象 O,则加载 A、修改对象 O、加载 B 应该可以找到,即 B 将看到对象的更改O?

首先,让程序加载器加载动态共享对象还是显式加载没有区别,例如在 *nix 系统上使用 dlopen()。同样的规则适用。

但是在这两种情况下,您的 AB 中都会有相同的对象实例。这是因为 C 链接了它们,它们都 在同一个进程中 。动态链接器只是确保每个进程都有自己的静态对象副本(但所有进程仍然可能共享代码段)。