【发布时间】:2013-02-16 15:33:37
【问题描述】:
当进程需要动态库中的函数时,是整个库加载到内存还是仅加载函数?
例如:
当我使用 printf() 或 libc 中的任何函数(假设它是一个动态库)时,是整个 libc 加载到内存中还是只加载了 printf() 函数?
【问题讨论】:
标签: dynamic linker libraries shared libc
当进程需要动态库中的函数时,是整个库加载到内存还是仅加载函数?
例如:
当我使用 printf() 或 libc 中的任何函数(假设它是一个动态库)时,是整个 libc 加载到内存中还是只加载了 printf() 函数?
【问题讨论】:
标签: dynamic linker libraries shared libc
是整个库加载到内存中还是只加载了函数?
答案取决于您所说的“加载到内存中”的确切含义,以及您运行程序的操作系统。
让我们考虑一下 Linux,以及针对 libc.so 的典型链接。
在那里,包含libc.so.6 的.data 和.text 的整个PT_LOAD 段在程序的第一条指令执行之前被mmap() 编入内存(因为您的程序记录了它需要 libc.so.6 在其.dynamic 部分)。
从那时起,当您访问代码时,代码会按需分页到 RAM 中。当您调用printf 时,包含printf 代码的页面将从磁盘中调入,或者(更有可能)从缓冲区缓存中重用。
【讨论】: