是什么确保在运行时遵循汇编程序对齐指令?

时间:2014-10-02 01:44:50

标签: assembly linker gnu memory-alignment

我正在汇编中编写一个函数foo,由于各种原因,第一个 函数的指令必须落在具有特定对齐的地址 执行二进制文件时在虚拟内存中例如,在代码中 下面我已经请求了13位对齐,所以在运行时该函数的地址 必须是0x2000的倍数。

这样做似乎很自然:

// The function must be aligned to 2^ALIGNMENT_BITS bytes.
#define ALIGNMENT_BITS 13

.text
.p2align ALIGNMENT_BITS
foo:
    [...]

但是,GNU assembler documentation仅表示.p2align个问题 汇编程序中的位置计数器,而不是任何对齐信息 最终会成为二进制文件。所以,例如,如果这是第一个 文件中的指令,它是一个无操作。我担心如果产生的对象 file与其他目标文件链接,它可以简单地连接到一个 任意地址。

  1. 对齐信息是否会以某种方式进入目标文件 由汇编程序生成?如果是这样,那么机制是什么,就是这样 记录在哪里?

  2. 同样,最终的二进制文件是否包含必要的对齐信息 确保操作系统将文本部分映射到适当的基址 虚拟内存?

  3. 如果你愿意,你可以在这里假设Linux。

1 个答案:

答案 0 :(得分:2)

在ELF目标文件中(例如,在Linux上),节中存在的最大对齐值将传播到节的对齐方式。例如,编译上面提供的代码并在其上运行objdump -h表示该部分的对齐方式为2**13

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00200000  00000000  00000000  00100000  2**13
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE

请注意,如果.p2align出现在该部分的其他位置,情况也是如此。否则,如果该部分移动了较小的数量,则会违反该部分内的对齐!