C “一个”是什么意思;Algn";objdump输出中的2**2和2**0平均值?

C “一个”是什么意思;Algn";objdump输出中的2**2和2**0平均值?,c,elf,objdump,C,Elf,Objdump,在下面的文件中这意味着什么2**2和2**0 $objdump-h main.o main.o:文件格式elf32-i386 部分: Idx名称大小VMA LMA文件关闭Algn 0.文本000000000000000000000000000000342**2 内容、分配、加载、只读、代码 1.数据000000000000000000000000 40 2**2 内容、分配、加载、数据 2.bss 000000000000000000000000 40 2**2 阿洛克 3.note.GNU-s

在下面的文件中这意味着什么<代码>2**2和
2**0

$objdump-h main.o
main.o:文件格式elf32-i386
部分:
Idx名称大小VMA LMA文件关闭Algn
0.文本000000000000000000000000000000342**2
内容、分配、加载、只读、代码
1.数据000000000000000000000000 40 2**2
内容、分配、加载、数据
2.bss 000000000000000000000000 40 2**2
阿洛克
3.note.GNU-stack 00000000000000000000000040 2**0
内容,只读,代码

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

该值来自ELF节标题的
sh_addralign
字段。各国(强调我国):

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

因为,由于对齐必须是二的幂,所以只有
objdump
使用
2**x
符号将该值表示为二的幂才有意义

请注意,在某些语言中,如和,
**
是幂或幂运算符


看一看,我们看到:

以及:

其中,
bfd的
alignment\u power
成员是:

/* The alignment requirement of the section, as an exponent of 2 -
   e.g., 3 aligns to 2^3 (or 8). */

unsigned int alignment_power;


无需假设。当然,你是对的。@RayToal在这个链接中没有任何东西表明
2**2
表示4。好吧,这个链接是对的,但说真的,“必须是2的幂”很难理解,除非是
objdump
作者以
2**
n的形式编写对齐方式的许可证。@RayToal谢谢,我完全同意。只是挖掘一些可靠的东西来引用。
**
意思是力量来自FORTRANA更通用的“解释所有标题问题”:
#define bfd_get_section_alignment(bfd, ptr) ((ptr)->alignment_power + 0)
/* The alignment requirement of the section, as an exponent of 2 -
   e.g., 3 aligns to 2^3 (or 8). */

unsigned int alignment_power;