【问题标题】:Empty space between .text and .fini data segments?.text 和 .fini 数据段之间的空白?
【发布时间】:2017-11-08 17:37:44
【问题描述】:

我编译了一个简单的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 开始?这和对齐有关系吗?我也注意到其他一些部分之间也存在类似的差距。

【问题讨论】:

  • 可能对齐。但你为什么要问?好奇心?还是有其他问题导致这个问题?
  • 试图找出方法来识别虚拟地址空间中.text段的范围
  • 您可能会在链接器脚本中找到如下内容:. = ALIGN(4);

标签: c elf objdump


【解决方案1】:

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:

【讨论】:

    猜你喜欢
    • 2020-07-11
    • 1970-01-01
    • 2011-03-30
    • 2021-02-12
    • 1970-01-01
    • 2012-09-17
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多