我正在汇编中编写一个函数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与其他目标文件链接,它可以简单地连接到一个
任意地址。
对齐信息是否会以某种方式进入目标文件 由汇编程序生成?如果是这样,那么机制是什么,就是这样 记录在哪里?
同样,最终的二进制文件是否包含必要的对齐信息 确保操作系统将文本部分映射到适当的基址 虚拟内存?
如果你愿意,你可以在这里假设Linux。
答案 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
出现在该部分的其他位置,情况也是如此。否则,如果该部分移动了较小的数量,则会违反该部分内的对齐!