LD:链接描述文件中的ALIGN与SUBALIGN

时间:2019-03-12 15:41:20

标签: gcc linker ld memory-alignment sections

它们有何不同?

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

何时应使用ALIGN(),何时应使用SUBALIGN()?

1 个答案:

答案 0 :(得分:1)

SUBALIGN是 专门用于调整输出部分中 input 部分 中的对齐方式。 为了说明:

$ 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之后。

来自输入节char的{​​{1}}符号a_one位于one.o(.mysection)的开头 在下一个字节之后紧跟.mysection,也来自输入节b_two。在下一个字节, 是来自输入节one.o(.mysection)的{​​{1}},然后是a_two的{​​{1}}。全部4个 来自所有输入节two.o(.mysection)的对象只是从输出节b_two的开始开始并排放置。

案例2

two.o(.mysection)

这次,*(.mysection)的8字节对齐地址不变。但是 .mysection的效果是符号$ 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节放在下一个16字节 SUBALIGN(16)开头之后的边界,0x10010和符号a_one,它们来自 相同输入节位于下一个字节。但是符号one.o(.mysection)来自输入部分 .mysection位于 next 16字节边界,0x10020;和b_one 同样来自a_two的地址,之后是1个字节。