.text 和 .fini 数据段之间为空 space?

Empty space between .text and .fini data segments?

我编译了一个简单的 C 程序 (gcc -o file file.cpp) 并在 运行 objdump -h file,

上获得了以下输出
 12 .text         00000172  0000000000400400  0000000000400400  00000400  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 13 .fini         00000009  0000000000400574  0000000000400574  00000574  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE

我有一个简短的问题。

为什么.text段后有2个字节的空隙? 0x400400 + 0x172 = 0x400572,但是 .fini 部分是从 0x400574 开始的?这跟对齐有关系吗?我也注意到其他一些部分之间存在类似的差距。

objdump -h file 输出的最后一列是该部分的对齐方式。 .fini 的对齐方式是 42**2 是 2 的 2 次方),这就是为什么它从 0x400574 而不是 0x400572 开始的原因。

针对 x86-64 的 glibc 进行链接时,.fini 部分的 4 对齐在 crti.o:

中指定
    .section .fini,"ax",@progbits
    .p2align 2
    .globl _fini
    .type _fini, @function
_fini: