C、c++:共享库:是加载到内存中的单个函数或完整库
C, C++: Shared libraries: Are single functions or complete libraries loaded into memory?
使用静态编译,只有程序实际需要的库函数才链接到程序。共享库是怎样的呢?是否只有程序实际需要的函数被动态链接器加载到内存中,还是总是加载整个共享库?如果它是函数,我怎么能得到一个程序的实际大小,包括它在运行时加载的函数?
谢谢!奥利弗
使用静态编译,只有程序实际需要的库函数才链接到程序。
程序以符号方式引用共享库,也就是说,程序将通过名称识别与之链接的共享库。
动态连接器是否只将程序实际需要的函数加载到内存中,还是总是加载整个共享库?
程序将引用共享库中的特定入口点和数据对象。共享库将作为单个大对象映射到内存中,但是只有实际引用的页面才会被内核分页。加载库的总量将取决于引用的密度、链接到库的其他图像的引用以及库自身功能的位置。
如果它是函数,我怎么能得到一个程序的实际大小,包括它在运行时加载的函数
在Mac和其他基于unix的系统上最好的方法是使用ps(1)。
静态链接时,只有(可能)被调用的函数被链接到可执行文件中——但在运行时,可执行文件中的数据将通过需求分页读取到内存中。
当进程创建时,地址被分配给该进程的可执行库和共享库中的所有代码,但此时文件中的代码/数据不一定被读入物理内存。当您尝试访问当前不在物理内存中的地址时,它将触发not-present异常。操作系统虚拟内存管理器将通过从文件中读取该页到物理内存来做出反应,而不是让访问继续进行。
加载是在逐页的基础上完成的,这通常意味着每次4或8千字节的块(例如,x86使用4K页,Alpha使用8k页)。x86也有能力创建更大(4兆字节)的页面,但这些页面并不(至少通常)用于普通代码——它们是用于映射大块内存,这些内存块保持永久映射(半),例如典型显卡上的内存"窗口",它也被映射,因此它可以被CPU直接访问。
大多数加载器都有一些优化,因此(例如)它们会在程序初始启动时尝试读取更大的内存块。这使得它的启动速度比中断和访问每一页代码时单独读取更快。这种优化的具体细节在不同的操作系统(通常甚至是相同操作系统的版本)之间是不同的。
- C++调用具有 *this 属性的单个帮助程序函数
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 如何在 c++ 中将整个数组初始化为类构造函数中的单个元素
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 多个可变参数函数的单个模板参数包?
- 将指向多维数组向量中的单个项的指针传递给函数 c++
- 如何将多个函数重载作为单个参数传递?
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 如何使用 TBB 在单个线程中运行函数
- 模板化虚拟函数,管理单个类的不同类属性
- 如何对具有相同类型的成员使用单个函数 C++.
- 如何使用每个对象的单个构造函数参数动态分配C++对象数组?
- 外部 C 和 C++ 对于单个函数(bsearch / qsort)的目的是什么?
- 如何使用 std::cout 或 std::ofstream 作为单个函数的输入?
- C 使用单个函数对具有多种值类型的数组排序
- 如何使用单个对象调用具有相同名称的两个类函数
- 如何在C 中的单个构造函数中调用多个构造函数
- C++ 中深度嵌套函数的单个捕获全部语句?
- C :类 - 超载构造函数 - 单个变量