C 在ELF文件中,线段偏移量如何不能被对齐Al整除?

C 在ELF文件中,线段偏移量如何不能被对齐Al整除?,c,linux,embedded,C,Linux,Embedded,如上所述,该段从0x34地址开始,但其Al为4,因此不能除以2**4 我的意思是:0x34%16!=所以我想问为什么。文本段的地址不是从16的整数倍开始的 节头结构如下所示: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 1] .text PROGBITS 00000000 000034 00002a 00 AX 0 0 4 因此,

如上所述,该段从0x34地址开始,但其Al为4,因此不能除以2**4


我的意思是:0x34%16!=所以我想问为什么。文本段的地址不是从16的整数倍开始的

节头结构如下所示:

[Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
[ 1] .text             PROGBITS        00000000 000034 00002a 00  AX  0   0  4
因此,您在
Al
列下看到的是
sh_addralign
。让我们看一下以下对该成员的描述:


TL;DR:显示在
Al
列中的对齐约束用于
Addr
(在您的情况下,它是对齐的,因为它是零),而不是
Off
。换言之,它是映像加载到内存中的地址的对齐约束,而不是它存储在ELF文件中的位置。

节头结构如下所示:

[Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
[ 1] .text             PROGBITS        00000000 000034 00002a 00  AX  0   0  4
因此,您在
Al
列下看到的是
sh_addralign
。让我们看一下以下对该成员的描述:


TL;DR:显示在
Al
列中的对齐约束用于
Addr
(在您的情况下,它是对齐的,因为它是零),而不是
Off
。换句话说,它是映像加载到内存中的地址的对齐约束,而不是它存储在ELF文件中的位置。

我在英特尔x86上测试它。通用的是什么问题:我在英特尔x86上测试它。通用的是什么问题:进一步说:sh_offset是ELF文件中的偏移量,而不是内存中的偏移量。酷,我理解。你的意思是在我的例子中,al是4,因为addr是0x0?不完全正确
Al
不是4,因为
Addr
的值-
Al
是对
Addr
的约束,而不是相反。对于
Addr==0
,该约束得到满足,因为
0%16==0
。此外,尽管该值被约束为二的幂,但它是一个实际值,而不是指数。所以,4表示4,而不是16。我有点乱,你的意思是AL是用于对齐的节的值吗?所以当AL为4时,节与4字节对齐,不是吗?进一步说:sh_offset是elf文件中的偏移量,而不是内存中的偏移量。酷,我理解它。你的意思是,在我的情况下,AL是4,因为addr是0x0?不完全正确
Al
不是4,因为
Addr
的值-
Al
是对
Addr
的约束,而不是相反。对于
Addr==0
,该约束得到满足,因为
0%16==0
。此外,尽管该值被约束为二的幂,但它是一个实际值,而不是指数。所以,4表示4,而不是16。我有点乱,你的意思是AL是用于对齐的节的值吗?所以当AL为4时,节与4字节对齐,不是吗?
sh_addralign
             Some sections have address alignment constraints.  If a
             section holds a doubleword, the system must ensure
             doubleword alignment for the entire section.  That is, the
             value of sh_addr must be congruent to zero, modulo the
             value of sh_addralign.  Only zero and positive integral
             powers of two are allowed.  Values of zero or one mean the
             section has no alignment constraints.