Does dlopen create multiple library instances?(Dlopen是否会创建多个库实例?)
问题描述
在网上搜索后,似乎找不到答案。
当我第一次使用dlOpen时,它似乎比之后的任何时间都要长,包括如果我从一个程序的多个实例运行它。
dlopen是否将SO加载到内存中一次,并让操作系统保存它,以便任何后续调用(即使是来自程序的另一个实例)都指向内存中的同一位置?
那么基本上,运行库的程序的3个实例是否意味着相同.so的3个实例被加载到内存中,或者内存中只有一个实例?
谢谢
推荐答案
dlopen是否将SO加载到内存中一次,并让操作系统保存它,以便任何后续调用(即使是来自程序的另一个实例)都指向内存中的同一位置?
从单个进程内对dlopen
的多个调用保证不会多次加载库。来自man page:
If the same shared object is loaded again with dlopen(), the same
object handle is returned. The dynamic linker maintains reference
counts for object handles, so a dynamically loaded shared object is
not deallocated until dlclose() has been called on it as many times
as dlopen() has succeeded on it.
第一次调用dlopen
时,库被mmap
放入调用进程。通常至少有两个单独的mmap
调用:.text
和.rodata
部分(通常位于单个RO段中)映射为只读,.data
和.bss
部分映射为读写。
dlopen
执行相同的mmap
。但是,操作系统不必从磁盘加载任何只读数据-它只增加已为第一次dlopen
调用加载的页面上的引用计数。这就是"共享库"中的共享。
那么基本上,运行库的程序的3个实例是否意味着相同.so的3个实例被加载到内存中,或者内存中只有一个实例?
取决于您所说的"实例"。
每个进程都有自己的一组(动态分配的)运行时加载器结构来描述这个库,每组都包含一个共享库的"实例"(可以在不同的进程中加载到不同的地址)。每个进程还将拥有自己的可写数据实例(使用写入时复制语义)。但只读映射将全部占用相同的物理内存(尽管它们可能出现在每个进程中的不同地址)。这篇关于Dlopen是否会创建多个库实例?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Dlopen是否会创建多个库实例?
基础教程推荐
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++,'if' 表达式中的变量声明 2021-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01