当可执行文件与静态库链接时,可执行文件只包含代码中使用的必要库部分,对吧?
但我错过了这部分 - 如何正确使用共享对象(动态链接库)?
据我所知,它们不包含在可执行文件中,它们是使用dlopen
动态加载的,这是由链接器直接完成的,对吗?
在这种情况下,这个库位于内存中的哪个位置?我的意思是,这里有帖子,解释说动态库可以减少内存使用量,但究竟是怎么回事?如果动态库以某种方式加载到共享内存中(对于多个进程),在这种情况下内核如何处理并发?
我意识到这可能是根本性的,如果这是重复的话我很抱歉,我找不到。
我知道Static linking vs dynamic linking,我的要求有点不同。
答案 0 :(得分:7)
共享库确实被加载到所有“用户”(使用相同库的所有应用程序)之间共享的内存中。
这基本上是通过引用计数完成的,因此对于库的每个新用户,引用都会计算在内。当应用程序退出时,引用计数将倒计时。如果它变为零,则不再需要库,并且将从内存中删除(很可能仅在“其他内容需要内存”时,而不是“立即”)。引用计数由内核“原子地”完成,因此不存在并发冲突。
请注意,它只是共享库中实际共享的CODE。每个进程的任何数据部分都是私有的。
答案 1 :(得分:0)
动态库仅为使用它们的所有进程加载一次。然后,操作系统将动态库的内存映射到进程地址空间。这样,它只消耗一次所需的内存。使用静态链接,所有可执行文件都包含静态链接代码。加载可执行文件时,也会加载静态链接的代码。这意味着,10个可执行文件中包含的函数在内存中驻留10次。