.text和.fini数据段之间的空白区域?

时间:2017-11-08 17:37:44

标签: c elf objdump

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

1 个答案:

答案 0 :(得分:2)

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

在针对x86-64的glibc链接时,4部分.fini部分的 .section .fini,"ax",@progbits .p2align 2 .globl _fini .type _fini, @function _fini: 对齐方式已在crti.o中指定:

var d = new Date(); //get date

h = d.getHours(); //get hours, minutes and seconds
m = d.getMinutes();
s = d.getSeconds();

if (h < 10) {  // In case an hour, a minute or a second is less than 10 (so 1 decimal),
  h = "0" + h; // an extra '0' will be added.
}
if (m < 10) {
  m = "0" + m;
}
if (s < 10) {
  s = "0" + s;
}

if (s == 0) { // If 'seconds' is equal to zero, it'll only return the hours and minutes.
  return(h + ":" + m);
} else {
  return(h + ":" + m + ":" + s);
}