【问题标题】:When are shared library functions loaded into the heap?共享库函数何时加载到堆中?
【发布时间】:2019-08-18 17:14:46
【问题描述】:

(这个问题只涉及逻辑地址)

我正在尝试一些代码,我打印出不同类型/范围的变量的地址,以更好地可视化过程图像。

当我打印出一些由 malloc 在堆上分配的变量的地址时,我产生了困惑,然后出于好奇还打印了 printf 函数的地址。

我发现 printf 被存储在堆上比 malloc 分配的变量更高的地址(即更靠近堆栈)。这对我来说没有意义,因为我假设库函数会在运行时首先在堆上加载,然后再执行任何其他指令。我什至在任何 malloc 语句之前放置了一个 printf 语句,以防库函数在需要时动态加载,但它并没有改变任何东西。

谢谢。

【问题讨论】:

标签: c memory heap-memory


【解决方案1】:

(此答案仅涉及 Unix。我不知道它在 Windows 上的情况。)

大多数共享库在控制到达main 之前被加载到RAM 中,包含printf 的库肯定会。 dlfcn.h中的函数可以在程序执行过程中加载更多的共享库,这是最重要的例外。

共享库从未作为“堆”的一部分加载,如果您指的是用于满足malloc 请求的内存区域。它们使用系统原语mmap 加载,并且可以放置在内存中的任何位置。正如 user3386109 在对该问题的评论中指出的那样,在现代系统上,它们的位置是 intentionally randomized,作为各种攻击的对策。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 2019-02-10
    • 2011-05-29
    • 2021-05-23
    相关资源
    最近更新 更多