在objdump的输出中,2 ** 2和2 ** 0的“Algn”是什么意思?

时间:2014-02-12 04:05:15

标签: c elf objdump

这在下面的文件中意味着什么? 2**22**0

$ objdump -h main.o

main.o:     file format elf32-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000000b  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00000000  00000000  00000040  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  00000040  2**2
                  ALLOC
  3 .note.GNU-stack 00000000  00000000  00000000  00000040  2**0
                  CONTENTS, READONLY, CODE

1 个答案:

答案 0 :(得分:7)

我认为2**2表示2 2 或4字节对齐,而2**0表示没有(一个字节)对齐。

此值来自ELF部分标题的sh_addralign字段。 ELF specification州(强调我的):

  

sh_addralign某些部分有地址对齐限制。例如,如果某个部分包含a   双字,系统必须确保整个部分的双字对齐。   也就是说,sh_addr的值必须与0一致,以模数为模   sh_addralign。目前,仅允许0和2的正整数幂。   值0和1表示该部分没有对齐约束。

作为Ray Toal mentioned,由于对齐必须是2的幂,因此objdump只有2**x表示法将此值表示为2的幂才有意义。

请注意,在某些语言中,PythonFORTRAN**是幂或取幂运算符。


objdump.c,我们看到:

static void
dump_section_header (bfd *abfd, asection *section,
             void *ignored ATTRIBUTE_UNUSED)
{
  // ...
  printf ("  %08lx  2**%u", (unsigned long) section->filepos,
      bfd_get_section_alignment (abfd, section));

objdump.h

#define bfd_get_section_alignment(bfd, ptr) ((ptr)->alignment_power + 0)

alignment_power的{​​{1}}成员是:

bfd