我在汇编中写入函数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
垫 汇编内的位置计数器,没有任何对齐信息 最终将使它的二进制文件。因此,例如,如果这是该文件中的第一个 指令,则它是无操作的。我担心,如果生成的对象 文件与其他目标文件链接,则可能会简单地连接到 任意地址。
将对齐信息以某种方式使之成为由汇编程序生成的目标文件 ?如果是这样,这个机制是什么,并且这个 记录在某处?
类似地,确实最终二进制包含必要的对准信息 以确保OS文本部分映射到一个适当的基地址在 虚拟存储器?
如果您喜欢,您可以在这里假设Linux。
谢谢,这正是我想象的。我正在寻找另外两件细节: 1.这是否记录在某处?也许我只是读了'.p2align'的链接汇编程序 文档,但它并没有说明有关 的任何信息,告知链接程序。 2.我假设一个类似的事情发生时,N个对象文件链接到一个 二进制 - 每个部分的最大对齐约束被选中? – jacobsa 2014-10-02 06:53:13