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

这在下面的文件中意味着什么? 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 

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

此值来自ELF节标题的sh_addralign字段。 ELF规范声明(强调我的):

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

正如Ray Toal所提到的 ,由于对齐必须是2的幂,因此只有objdump将这个值用2**x表示法表示为2**x的幂才有意义。

请注意,在某些语言中,如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)); 

objdump.h

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

其中bfdalignment_power成员是:

 /* The alignment requirement of the section, as an exponent of 2 - eg, 3 aligns to 2^3 (or 8). */ unsigned int alignment_power;