【问题标题】:loading and dynamic linking加载和动态链接
【发布时间】:2013-02-16 15:33:37
【问题描述】:

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

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

【问题讨论】:

    标签: dynamic linker libraries shared libc


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 通过“磁盘”(“从磁盘分页”)你的意思是 RAM 或交换。
    • @vanangamudi 请使用完整的单词,例如“you”而不是“u”。不,“磁盘”是指这种磁盘:en.wikipedia.org/wiki/Hard_disk_drive_platter
    猜你喜欢
    • 2013-07-07
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2011-01-04
    • 2012-04-16
    相关资源
    最近更新 更多