加载和动态链接

时间:2013-02-16 15:33:37

标签: dynamic linker libraries shared libc

当一个进程需要一个动态库中的函数时,是将整个库加载到内存中还是只加载了该函数?

例如: 当我使用printf()或libc中的任何函数(假设它是一个动态库)时,整个libc是加载到内存还是只加载printf()函数?

1 个答案:

答案 0 :(得分:1)

  

是整个库加载到内存中还是只加载了单独的函数?

答案取决于“加载到内存中”的含义,以及运行程序的操作系统。

让我们考虑Linux,以及针对libc.so的典型链接。

在程序的第一条指令执行之前,包含PT_LOAD.data .text libc.so.6的整个mmap()段都会libc.so.6进入内存因为您的程序在其.dynamic部分中记录了需要 printf

从那时起,当您访问代码时,代码 demand paged 进入RAM。当您调用printf时,包含{{1}}代码的页面将从磁盘中分页,或者(更有可能)从缓冲区缓存中重用。