这在下面的文件中意味着什么? 2**2
和2**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
答案 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的幂才有意义。
请注意,在某些语言中,Python和FORTRAN,**
是幂或取幂运算符。
看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));
#define bfd_get_section_alignment(bfd, ptr) ((ptr)->alignment_power + 0)
alignment_power
的{{1}}成员是:
bfd