【问题标题】:Why are functions loaded at aligned addresses in x86 Linux for elf executables?为什么在 x86 Linux 中为 elf 可执行文件加载对齐地址的函数?
【发布时间】:2010-05-19 23:43:29
【问题描述】:

我一直在研究 x86 上的 Linux elf 可执行文件,主要使用 IDA,但 还有gdb。我注意到的一件事是函数总是被加载 在字对齐的地址?有谁知道其中的原因? 我不知道启动 x86 指令的任何要求 在对齐的地址。并且不能是由于页面对齐的原因 页面边界仍然可以在函数内的任何位置。

如果有任何见解,我将不胜感激。

谢谢。

【问题讨论】:

    标签: linux loading elf


    【解决方案1】:

    你是对的,指令不需要对齐。在 x86 处理器上,汇编指令使用从 1 到至少 15 个字节的可变长度代码进行编码。

    但是指令是从通常以 64 字节对齐的缓存中读取的,并且当代码正确对齐时,执行管道的某些部分运行得更快:解码、循环、分支预测等。

    这方面的最佳信息来源是 Agner Fog 的文档:http://www.agner.org/optimize/

    【讨论】:

      【解决方案2】:

      对于某些架构,数据的对齐方式决定了每次操作可以复制的数据量。例如,尝试从地址 0x4000 复制 32 位可能需要一次 32 位移动操作,而从 0x4001 复制 32 位可能需要 4 次 8 位移动操作。此外,对未对齐的地址使用 32 位移动指令可能会触发硬件异常。硬件异常通过一次复制 8 位来处理,但比从对齐地址复制要慢。

      编辑:

      这适用于所有数据,而不仅仅是将要执行的数据。因此,函数入口点与切换目标、字符串常量、全局变量和其他数据对齐。

      【讨论】:

      • 但代码就是数据,反之亦然:最后都是一和零。
      猜你喜欢
      • 2021-02-25
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 2020-09-18
      相关资源
      最近更新 更多