C语言运行时库操作:共享库是否在运行时并入核心镜像?
静态库与共享库在ELF加载中的核心差异
首先直接给出结论:共享对象库不会在运行时被并入程序的“core-image”,二者的加载机制本质不同,你的理解存在关键误区。
静态库的加载逻辑
静态库(.a格式)是在编译链接阶段就被完全整合进最终的ELF可执行文件里。链接器会把你的代码、数据,加上程序用到的静态库代码片段,打包成一个单一的独立ELF文件。运行时,操作系统加载的就是这个完整文件,整个程序作为一个“core-image”驻留内存,没有额外的库加载步骤。
共享库的加载逻辑
共享库(.so格式)是在程序运行阶段由动态链接器(比如Linux下的ld-linux.so)单独处理的:
- 你的ELF可执行文件里只存了共享库的依赖信息(比如库名、需要调用的符号),没有库的实际代码;
- 程序启动时,动态链接器会找到对应的
.so文件,把它加载到内存的独立区域; - 然后把程序中调用共享库函数的地址,跳转指向共享库在内存中的实际位置。
这种机制下,共享库的代码是独立于程序“core-image”存在的——多个程序可以共享同一份已加载的共享库内存镜像(这也是共享库节省内存、方便批量更新的核心优势),完全不存在“并入单个程序core-image”的情况。
误区澄清
你预期的“共享库并入core-image达到静态库效果”是对共享库设计目标的误解。共享库从诞生起就是为了实现代码共享、减小可执行文件体积、简化库的版本更新,它的加载机制和静态库从根上就不一样,不会被合并到程序的核心镜像中。
内容的提问来源于stack exchange,提问作者Barry Say
相关产品推荐
相关产品推荐

