如何设置 .data 部分的对齐方式?

How to set the alignment for the .data section?

我在 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 部分的对齐方式?

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

但是,知道(或设置)节开始的最小对齐方式,汇编器可以支持 align 任何 2 的幂在中间的任何点的指令任何部分align 指令不必位于节的开头。