什么是“加法”?

逆向工程 符号 动态链接 术语
2021-06-17 08:30:36

来自Ryan "elfmaster" O'Neill 的Learning Linux Binary Analysis在第 32 页,作者指出,

32 位 ELF 文件的重定位记录与 64 位相同,但使用 32 位整数。以下示例将目标文件代码编译为 32 位,以便我们可以演示隐式加数,这在 64 位中不常用。一个隐式加数当重定位记录存储在发生ElfN_Rel不包含一个类型结构r_addend字段,因此,加数被存储在重定位目标本身。64 位可执行文件倾向于使用ElfN_Rela包含显式加数结构我认为理解这两种情况都是值得的,但隐式加数有点令人困惑,所以给这个领域带来光明是有道理的。

“加数”的实际定义是什么?

3个回答

我认为它只是意味着“添加的数字”,在这种情况下“添加到基本加载地址(或段加载地址)以计算此重定位的最终指针的数字”。

让我们想象一下,当我们将二进制文件加载到内存 0x400000 处时,我们在 0x401234 处有一个指向 0x405678 的指针。(如果我们在 0x800000 处加载二进制文件,那么它应该指向 0x805678,因此它需要重新定位。)我不知道 ELF,但我对此的理解是

  • 在隐式情况下,重定位表仅存储二进制文件的偏移量,在这种情况下为 0x1234,在我们的二进制文件中,偏移量为 0x1234,我们存储目标偏移量为 0x5678。因此搬迁成为

    对于A重定位表中的每个地址*(base + A) += base

    (这就是重定位表在 PE 文件中的工作方式。)

  • 在显式情况下,重定位表将偏移量存储到您的二进制文件和目标偏移量中,即 0x1234 0x5678。所以搬迁到这里是

    对于A, B重定位表中的每个地址对*(base + A) = base + B

    在这种情况下,我不知道偏移量 0x1234 处的二进制文件中有什么。

  • Augend是一个术语,表示需要加法的数
  • Addend是您要添加的数字。

来自Dictionary.com

您是否曾经发现自己盯着一张写有“3 + 4”的纸,想知道“这两个相应数量中的每一个的正确术语是什么?” 不?第一个数字是被加数与它相加的数字是加数。

您可以在维基百科的“计算结果”中看到其他数学术语的图表

计算结果

为什么这里有特殊条款?

  • 嗯,这可能是因为在汇编中add rbi, rax实际上会将结果存储在rbi. 所以知道第一个参数不仅仅是一个参数,add而是目的地;add rax, rbi将结果存储在rax. 如果使用运算符显示程序集,我们将使用rbi += raxand rax += rbi
  • 因为加数并不总是偏移量,被加数并不总是基数。虽然在这个特定的例子中,“偏移”更合适。
  • 在这种特定情况下,术语“隐式偏移”可以在工具接口标准 (TIS) 可执行和链接格式 (ELF) 规范版本 1.2 中找到

    ... 只有Elf32_Rela条目包含显式加数。类型的条目Elf32_Rel在要修改的位置存储一个隐式加数。根据处理器架构,一种形式或另一种形式可能是必要的或更方便的。因此,特定机器的实现可以根据上下文专门使用一种形式或任一形式。

根据梅里安韦伯斯特的说法,加数只是“一个要与另一个相加的数字”