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

C 从多个库动态加载时,静态存储持续时间对象的唯一性得到了保证,c,linux,unix,shared-libraries,dlopen,C,Linux,Unix,Shared Libraries,Dlopen,假设有一个共享库S,有一个共享库a和B,还有一个可执行库CA和B与S链接C不会链接到A和B,而是C通过dlopen动态加载A和BS有一个静态存储持续时间对象O,该对象带有外部链接,在a和B内部使用 我知道链接器通过外部链接保证静态对象的唯一性,例如,如果C将与A和B链接,那么O将是唯一的,但我不确定动态库加载 动态加载的库A和B是否共享对象O的相同内存,还是将是两个单独分配的对象O?如果对象O是共享的,那么加载A、修改对象O、加载B应该可以找到,即B将看到对象的更改O?首先,让程序加载器加载动态

假设有一个共享库
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
链接两者,两者都在同一个过程中。动态链接器只是确保每个进程都有自己的静态对象副本(而所有进程仍可能共享代码段)。

“如果
C
将链接到
A
B
,那么
O
将是唯一的”——我非常怀疑。非常感谢您的回答。有一件事刚刚打动了我,如果对象
O
A
B
中,因此没有库
S
O
就在链接到
A
B
的静态存档中,该怎么办。加载程序会认为它是
C
中唯一的一个对象吗?如果静态链接某些数据,它将成为链接到的模块的一部分。因此
A
中的
O
B
中的
O
有所不同。