Gcc LD:链接器脚本中的对齐与子对齐

Gcc LD:链接器脚本中的对齐与子对齐,gcc,linker,ld,memory-alignment,sections,Gcc,Linker,Ld,Memory Alignment,Sections,它们有何不同 我读到SUBALIGN()以某种方式强制某种对齐。还有其他区别吗 什么时候应该使用ALIGN()和SUBALIGN()?是 专门用于调整输出部分中输入部分的对齐方式。 举例说明: $ cat one.c char a_one __attribute__((section(".mysection"))) = 0; char b_one __attribute__((section(".mysection"))) = 0; $ cat two.c char a_two __attri

它们有何不同

我读到SUBALIGN()以某种方式强制某种对齐。还有其他区别吗

什么时候应该使用ALIGN()和SUBALIGN()?

是 专门用于调整输出部分中输入部分的对齐方式。 举例说明:

$ cat one.c
char a_one __attribute__((section(".mysection"))) = 0;
char b_one __attribute__((section(".mysection"))) = 0;

$ cat two.c
char a_two __attribute__((section(".mysection"))) = 0;
char b_two __attribute__((section(".mysection"))) = 0;

$ gcc -c one.c two.c
案例1

$ cat foo_1.lds
SECTIONS
{
    . = 0x10004;
    .mysection ALIGN(8) : {
        *(.mysection)
    }
}

$ ld -T foo_1.lds one.o two.o -o foo1.out
$ readelf -s foo1.out

Symbol table '.symtab' contains 9 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000010008     0 SECTION LOCAL  DEFAULT    1 
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    2 
     3: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS one.c
     4: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS two.c
     5: 000000000001000b     1 OBJECT  GLOBAL DEFAULT    1 b_two
     6: 0000000000010008     1 OBJECT  GLOBAL DEFAULT    1 a_one
     7: 0000000000010009     1 OBJECT  GLOBAL DEFAULT    1 b_one
     8: 000000000001000a     1 OBJECT  GLOBAL DEFAULT    1 a_two

$ readelf -t foo1.out | grep -A3 mysection
  [ 1] .mysection
       PROGBITS               PROGBITS         0000000000010008  0000000000010008  0
       0000000000000004 0000000000000000  0                 1
       [0000000000000003]: WRITE, ALLOC
这里,
ALIGN(8)
.mysection
与下一个8字节边界0x10008对齐, 在0x10004之后

来自输入部分
one.o(.mysection)
char
符号
a\u one
,位于
.mysection
的开头 在下一个字节后面跟着
b_two
,同样来自输入部分
one.o(.mysection)
。在下一个字节, 是
a\u two
,从输入部分
two.o(.mysection)
,然后是
b\u two
,也从
two.o(.mysection)
。全部4个 所有输入节
*(.mysection)
中的对象都是从输出节
.mysection
的开始端到端放置的

案例2

$ cat foo_2.lds
SECTIONS
{
    . = 0x10004;
    .mysection ALIGN(8) : SUBALIGN(16) {
        *(.mysection)
    }
}

$ ld -T foo_2.lds one.o two.o -o foo2.out
$ readelf -s foo2.out

Symbol table '.symtab' contains 9 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000010008     0 SECTION LOCAL  DEFAULT    1 
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    2 
     3: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS one.c
     4: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS two.c
     5: 0000000000010021     1 OBJECT  GLOBAL DEFAULT    1 b_two
     6: 0000000000010010     1 OBJECT  GLOBAL DEFAULT    1 a_one
     7: 0000000000010011     1 OBJECT  GLOBAL DEFAULT    1 b_one
     8: 0000000000010020     1 OBJECT  GLOBAL DEFAULT    1 a_two

$ readelf -t foo2.out | grep -A3 mysection
  [ 1] .mysection
       PROGBITS               PROGBITS         0000000000010008  0000000000010008  0
       000000000000001a 0000000000000000  0                 16
       [0000000000000003]: WRITE, ALLOC
这次,
.mysection
的8字节对齐地址保持不变。但是
SUBALIGN(16)
的效果是符号
a_one
,来自输入 节
one.o(.mysection)
位于下一个16字节 边界0x10010,位于
.mysection
开始之后,符号
b_one
,来自 相同的输入部分位于下一个字节。但是符号
a_two
,来自输入部分
two.o(.mysection)
位于下一个16字节边界0x10020;和
b_two
,即将到来
同样来自
two.o(.mysection)
,之后是1个字节。

左侧与右侧的
的意义是什么?