3

当可执行文件与静态库链接时,可执行文件仅包含代码中使用的必要库部分,对吗?

但我错过了 - 如何准确使用共享对象(动态链接库)?

据我所知,它们不包含在可执行文件中,它们是使用动态加载的dlopen,这是由链接器直接完成的,对吧?

在这种情况下,这个库在内存中的什么位置?我的意思是,这里有帖子,解释说动态库可以减少内存使用,但究竟如何呢?如果动态库以某种方式加载到共享内存中(用于多个进程),那么在这种情况下内核如何处理并发?

我意识到这可能是基本的东西,如果这是重复的,我很抱歉,我找不到这样的东西。
我知道静态链接与动态链接,我问的有点不同。

4

2 回答 2

7

共享库确实被加载到所有“用户”(使用相同库的所有应用程序)之间共享的内存中。

这基本上是通过引用计数来完成的,因此对于图书馆的每个新用户,引用都会被计数。当应用程序退出时,引用计数会倒计时。如果它变为零,则不再需要该库,并将从内存中删除(很可能仅在“其他东西需要内存”时,而不是“立即”)。引用计数是由内核“原子地”完成的,因此不存在并发冲突。

请注意,实际上共享的只是共享库中的代码。每个进程的任何数据部分都是私有的。

于 2013-04-05T10:56:17.030 回答
0

对于使用它们的所有进程,动态库只加载一次。动态库的内存然后被操作系统映射到进程地址空间。这样,它只消耗一次所需的内存。使用静态链接,所有可执行文件都包含静态链接的代码。加载可执行文件时,也会加载静态链接的代码。这意味着,包含在 10 个可执行文件中的函数在内存中驻留 10 次。

于 2013-04-05T10:52:46.730 回答