我在NASM的 .data 部分中定义了以下变量:
section .data
var1 DD 12345 ; int (4 bytes)
var2 DB 'A' ; char (1 byte)
padding1 DB 123 ; 1 byte padding
padding2 DB 123 ; 1 byte padding
padding3 DB 123 ; 1 byte padding
var3 DQ 174.13 ; double (8 bytes)
为了正确对齐这些变量, .data 部分必须与8个字节对齐。
我相信 .data 部分的对齐方式是由链接器指定的。我正在使用Visual C ++ 2010链接器,如何使用此链接器设置 .data 部分的对齐方式?
答案 0 :(得分:2)
The align
directive适用于数据和代码。
在汇编程序的输出文件(MSVC链接器可以理解的格式的目标文件)中,它使用元数据发出每个部分所需的对齐信号。
例如,如果您使用
section .data
align 1024*1024*2
foo: dd 1234
align 8 ; will assemble to 4 bytes of padding to reach the next multiple of 8
bar: dd 4567
对象文件将其所需的对齐方式设置为2MiB。对于win32目标文件,NASM甚至具有用于节对齐的特殊语法:
section .data data align=4
ELF目标文件(Linux)的工作方式相同,每个部分都有一个必需的对齐方式。
您的目标文件(希望)最终不会填充最多2MiB的填充,如果它链接在链接之后的某个部分中具有几个字节的其他内容之后,它可能会链接到可执行文件中的.data
。
但是,知道(或设置)一个部分开头的最小对齐,汇编程序可以在任何部分中间的任何一点支持任何2的幂的align
指令。 align
指令不必位于节的开头。