当一个进程需要一个动态库中的函数时,是将整个库加载到内存中还是只加载了该函数?
例如:
当我使用printf()
或libc中的任何函数(假设它是一个动态库)时,整个libc是加载到内存还是只加载printf()
函数?
答案 0 :(得分:1)
是整个库加载到内存中还是只加载了单独的函数?
答案取决于“加载到内存中”的含义,以及运行程序的操作系统。
让我们考虑Linux,以及针对libc.so
的典型链接。
在程序的第一条指令执行之前,包含PT_LOAD
和.data
.text
libc.so.6
的整个mmap()
段都会libc.so.6
进入内存因为您的程序在其.dynamic
部分中记录了需要 printf
。
从那时起,当您访问代码时,代码 demand paged 进入RAM。当您调用printf
时,包含{{1}}代码的页面将从磁盘中分页,或者(更有可能)从缓冲区缓存中重用。