【问题标题】:ELF: Using the section size to calculate an address spanELF:使用节大小来计算地址跨度
【发布时间】:2018-12-06 14:59:21
【问题描述】:

我想知道一个节的大小与该节占用的地址空间的关系。 (这里我不假设动态加载或 MMU)

节大小是否包含 0 大小符号(如果有)?

例如说一个节的大小是 100 字节长,从地址 0 开始。我天真地假设这个节占用的地址空间是从 0 到 100。

但是,假设地址 0、1、2 和 3 有符号,它们的大小为 0,但确实有一个与之关联的地址,那么实际地址空间将为 0-103,其中 0-3 为空?

有这样的符号吗? 我是 ELF 格式的新手,不能 100% 确定它会如何工作。

【问题讨论】:

    标签: elf


    【解决方案1】:

    我想知道一个节的大小与该节占用的地址空间的关系。

    一个段通常不占用任何地址——一个会。

    ELF 代表可执行和可链接格式,具有双重用途:(静态)链接和执行。

    在链接阶段,链接器对进行操作,并将它们分配给 0 个或多个段(但通常最多分配给 1 个可加载段)。某些部分,例如 .note.comment 通常没有设置 SHF_ALLOC 标志,并且不会出现在任何可加载段中。

    注意静态链接后不需要section,可以完全去掉。

    在执行阶段,可加载段被mmaped 到地址空间中。如果一个节的大小为 100,有 SHF_ALLOC 标志,并被分配到某个 PT_LOAD 段,那么该节将占用 100 字节的地址空间。

    (我在这里不假设动态加载或 MMU)

    动态链接和 MMU 与这里发生的事情完全正交。提起他们,你只会搅浑水。

    例如说一个节的大小是 100 字节长,从地址 0 开始。我天真地假设这个节占用的地址空间是从 0 到 100。

    如上所述,您的世界观并不完全准确,该部分不太可能实际占据[0, 100) 地址范围。

    但是,假设地址 0、1、2 和 3 有符号,它们的大小为 0,但确实有一个与之关联的地址,那么实际地址空间将为 0-103,其中 0-3 为空?

    符号只是附加到某些地址的标签。它们本身不占用任何地址空间。它们也可以在(静态)链接之后完全剥离,尽管通常它们被保留以简化调试。这些符号/标签的存在使调试器可以告诉您您的程序崩溃,例如fscanffoo调用,从main调用。

    【讨论】:

    • 因此,您所说的是您无法从段地址空间中存在的符号确定段大小。对吗?
    • @Har 没错:符号根本不需要具有任何大小。此外,可以将多个部分分配给单个段,并且这些部分可能具有需要填充的对齐要求。添加符号大小可以为您提供近似的下限(可能有重叠的符号),但仅此而已。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2011-09-07
    • 2020-10-16
    • 1970-01-01
    相关资源
    最近更新 更多