当进程需要动态库中的函数时,是整个库加载到内存还是仅加载函数?
例如:当我使用printf()
libc 中的或任何函数时(假设它是一个动态库),是整个 libc 加载到内存中还是仅加载该printf()
函数?
是整个库加载到内存中还是仅加载了函数?
答案取决于您所说的“加载到内存”的确切含义,以及您正在运行程序的操作系统。
让我们考虑一下 Linux,以及针对libc.so
.
在那里,包含and of的整个PT_LOAD
段在程序的第一条指令甚至执行之前就被编入内存(因为您的程序记录了它在其部分中需要的内容)。.data
.text
libc.so.6
mmap()
libc.so.6
.dynamic
从那时起,当您访问它时,代码被要求分页到 RAM 中。当您调用printf
时,包含代码的printf
页面将从磁盘中调入,或者(更有可能)从缓冲区缓存中重用。