Gcc 有多少共享对象被加载到内存中

Gcc 有多少共享对象被加载到内存中,gcc,compiler-construction,compilation,shared-libraries,compiler-optimization,Gcc,Compiler Construction,Compilation,Shared Libraries,Compiler Optimization,如果有一个共享的对象文件,比如libComponent.so,它由两个对象文件Component_1.o和componenet_2.o组成 还有一个应用程序链接到libComponent.so,但只使用component_1.o函数 当应用程序运行并使用共享对象文件时,是否将整个共享对象(即libComponent.so)加载到内存中,还是仅加载组件_1.o gcc编译器中是否有选项可以切换这种仅从共享对象加载所需符号的行为?好的,这取决于“加载”的含义 动态链接器将把所有库映射到进程的虚拟内存

如果有一个共享的对象文件,比如libComponent.so,它由两个对象文件Component_1.o和componenet_2.o组成

还有一个应用程序链接到libComponent.so,但只使用component_1.o函数

当应用程序运行并使用共享对象文件时,是否将整个共享对象(即libComponent.so)加载到内存中,还是仅加载组件_1.o


gcc编译器中是否有选项可以切换这种仅从共享对象加载所需符号的行为?

好的,这取决于“加载”的含义

动态链接器将把所有库映射到进程的虚拟内存空间中,并将在可执行文件的导入表中为使用共享库中函数地址的每个库函数填写条目。但是填写导入表实际上并不会从这些地址加载,所以它们不会加载到物理内存中

从那时起,调用函数时,库代码将按需分页到物理内存中,就像进程虚拟地址空间中的任何其他可分页内存一样。如果一个函数从未被调用(直接从应用程序调用或间接从应用程序调用的另一个库函数调用),它将不会被分页。(分页是以页面大小粒度进行的,因此如果某个函数位于应用程序调用的函数旁边,则可能会引入应用程序不调用的函数。一些编译器使用配置文件引导优化将通常一起调用的函数放在一起,以尽量减少使用的页数。)


(旁白:如果您的库未编译为使用位置无关的代码,并且在其非默认基址处加载,则链接器在加载时需要在代码中修复地址,这将导致整个库被分页。这可以在首次加载每个页面时延迟完成,尽管我不确定哪些链接器会这样做。)

一些编译器专家能解释一下吗?