gpt4 book ai didi

c - 在同一进程中多次加载共享库的地址空间

转载 作者:IT王子 更新时间:2023-10-29 01:14:59 26 4
gpt4 key购买 nike

首先,我已经找到了 a few可能会回答我的问题的引用资料。虽然我计划很快阅读它们(即下类后),但我仍然在这里问,以防答案很简单并且不需要太多补充知识。

情况是这样的:我正在编写一个共享库(我们称它为 libA.so),它需要在同一进程中保持一致的内部状态(如在 .c 文件中声明的静态变量)状态。这个库将被程序 P 使用(即 P 是用 -lA 编译的)。如果到目前为止我了解所有内容,P 的地址空间将如下所示:

 ______________
| Program P |
| < |
| variables, |
| functions |
| from P |
| > |
| |
| < |
| libA: |
| variables, |
| functions |
| loaded (ie |
| *copied*) |
| from shared |
| object |
| > |
| < |
| stuff from |
| other |
| libraries |
| > |
|______________|

现在 P 有时会调用 dlopen("libQ.so", ...)。 libQ.so 也使用 libA.so(即使用 -lA 编译)。由于一切都发生在同一个进程中,因此无论调用来自 P 还是 Q,我都需要 libA 以某种方式保持相同的状态。

我不知道这将如何在内存中转换。它看起来像这样吗:

 ______________
| Program P |
| < |
| P stuff |
| > |
| |
| < |
| libA stuff, |
| loaded by P |
| > | => A's code and variables are duplicated
| |
| < |
| libQ stuff |
| < |
| libA stuff,|
| loaded by Q|
| > |
| > |
|______________|

...还是像这样?

 ______________
| Program P |
| < |
| P stuff |
| *libA |
| *libQ |
| > |
| |
| < |
| libA stuff, |
| loaded by P |
| > | => A's code is loaded once, Q holds some sort of pointer to it
| |
| < |
| libQ stuff |
| *libA |
| > |
|______________|

在第二种情况下,为单个进程保持一致的状态是微不足道的;在第一种情况下,它需要更多的努力(例如一些共享内存段,使用进程 ID 作为 ftok() 的第二个参数)。

当然,由于我对链接和加载的工作原理了解有限,所以上面的图表可能是完全错误的。据我所知,共享库可能位于内存中的固定空间,并且每个进程都访问相同的数据和代码。该行为还可能取决于 A 和/或 P 和/或 Q 的编译方式。而且这种行为可能与平台无关。

最佳答案

共享库的代码段存在于内存中的单个实例中每个系统。然而,它可以映射到不同进程的不同虚拟地址,因此不同进程在不同地址看到相同的函数(这就是为什么进入共享库的代码必须编译为 PIC)。

共享库的数据段为每个进程创建一个副本,并由库中指定的任何初始值初始化。

这意味着库的调用者不需要知道它是否共享:一个进程中的所有调用者看到函数的相同副本和库中定义的外部变量的相同副本。

不同的进程执行相同的代码,但有各自的数据副本,每个进程一份。

关于c - 在同一进程中多次加载共享库的地址空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22862372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com