从多个库动态加载时静态存储持续时间对象的唯一性保证
Static-storage-duration object uniquness guaranties when dynamically loaded from multiple libraries
假设有一个共享库 S
,有共享库 A
和 B
,还有一个可执行文件 C
。 A
和 B
链接到 S
。 C
未链接到 A
和 B
,而是 C
通过 dlopen
动态加载 A
和 B
。 S
有一个带有外部链接的静态存储持续时间对象 O
,在 A
和 B
.
中使用
我知道链接器通过外部链接保证静态对象的唯一性,例如,如果 C
将链接到 A
和 B
,那么 O
将是唯一的,但我不确定动态库加载。
动态加载库 A
和 B
会共享对象 O
的同一内存,还是两个单独分配的对象 O
?如果共享对象 O
,则加载 A
、修改对象 O
、加载 B
应该可以找到,即 B
将看到对象的更改O
?
首先,让程序加载器加载动态共享对象还是显式加载没有区别,例如在 *nix 系统上使用 dlopen()
。同样的规则适用。
但是在这两种情况下,您的 A
和 B
中都会有相同的对象实例。这是因为 C
链接了它们,它们都 在同一个进程中 。动态链接器只是确保每个进程都有自己的静态对象副本(但所有进程仍然可能共享代码段)。
假设有一个共享库 S
,有共享库 A
和 B
,还有一个可执行文件 C
。 A
和 B
链接到 S
。 C
未链接到 A
和 B
,而是 C
通过 dlopen
动态加载 A
和 B
。 S
有一个带有外部链接的静态存储持续时间对象 O
,在 A
和 B
.
我知道链接器通过外部链接保证静态对象的唯一性,例如,如果 C
将链接到 A
和 B
,那么 O
将是唯一的,但我不确定动态库加载。
动态加载库 A
和 B
会共享对象 O
的同一内存,还是两个单独分配的对象 O
?如果共享对象 O
,则加载 A
、修改对象 O
、加载 B
应该可以找到,即 B
将看到对象的更改O
?
首先,让程序加载器加载动态共享对象还是显式加载没有区别,例如在 *nix 系统上使用 dlopen()
。同样的规则适用。
但是在这两种情况下,您的 A
和 B
中都会有相同的对象实例。这是因为 C
链接了它们,它们都 在同一个进程中 。动态链接器只是确保每个进程都有自己的静态对象副本(但所有进程仍然可能共享代码段)。