2014-10-02 24 views
1

我在汇编中写入函数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垫 汇编内的位置计数器,没有任何对齐信息 最终将使它的二进制文件。因此,例如,如果这是该文件中的第一个 指令,则它是无操作的。我担心,如果生成的对象 文件与其他目标文件链接,则可能会简单地连接到 任意地址。

  1. 将对齐信息以某种方式使之成为由汇编程序生成的目标文件 ?如果是这样,这个机制是什么,并且这个 记录在某处?

  2. 类似地,确实最终二进制包含必要的对准信息 以确保OS文本部分映射到一个适当的基地址在 虚拟存储器?

如果您喜欢,您可以在这里假设Linux。

回答

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在本节别处。否则,如果该部分移动的数量较少,则会违反该部分内的对齐!

+0

谢谢,这正是我想象的。我正在寻找另外两件细节: 1.这是否记录在某处?也许我只是读了'.p2align'的链接汇编程序 文档,但它并没有说明有关 的任何信息,告知链接程序。 2.我假设一个类似的事情发生时,N个对象文件链接到一个 二进制 - 每个部分的最大对齐约束被选中? – jacobsa 2014-10-02 06:53:13