1

.bssリンカーがセクションのサイズを計算する方法を知りたいですか?

2 つの変数を持つテスト プログラムがあります。1 つはゼロに初期化され、もう 1 つは非ゼロに初期化されます。.bss のサイズが 4 であることを願っています。

# cat test.c && gcc -o test.o -c test.c && ld -o test test.o && readelf -Ss test
int _start=0;
int a = 2;
......
Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 1] .data             PROGBITS         00000000006000b0  000000b0
       0000000000000004  0000000000000000  WA       0     0     4
  [ 2] .bss              NOBITS           00000000006000b4  000000b4
       0000000000000004  0000000000000000  WA       0     0     4
.....
Symbol table '.symtab' contains 11 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     6: 00000000006000b4     4 OBJECT  GLOBAL DEFAULT    2 _start
    10: 00000000006000b0     4 OBJECT  GLOBAL DEFAULT    1 a

次に、ゼロで初期化された 2 番目の変数を追加します。今回.bssのサイズが8だといいのですが、12(0xc)です。

# cat test.c && gcc -o test.o -c test.c && ld -o test test.o && readelf -Ss test
int _start=0;
int a = 2;
int b = 0;
......
Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 1] .data             PROGBITS         00000000006000b0  000000b0
       0000000000000004  0000000000000000  WA       0     0     4
  [ 2] .bss              NOBITS           00000000006000b4  000000b4
       000000000000000c  0000000000000000  WA       0     0     4
......
Symbol table '.symtab' contains 12 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     6: 00000000006000b8     4 OBJECT  GLOBAL DEFAULT    2 b
     7: 00000000006000b4     4 OBJECT  GLOBAL DEFAULT    2 _start
    11: 00000000006000b0     4 OBJECT  GLOBAL DEFAULT    1 a

ゼロで初期化された 3 番目の変数を追加し続けます。今回は .bss のサイズが 12 であることを願っています。

# cat test.c && gcc -o test.o -c test.c && ld -o test test.o && readelf -Ss test
int _start=0;
int a = 2;
int b = 0;
int c = 0;
......
Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .data             PROGBITS         00000000006000b0  000000b0
       0000000000000004  0000000000000000  WA       0     0     4
  [ 2] .bss              NOBITS           00000000006000b4  000000b4
       000000000000000c  0000000000000000  WA       0     0     4
......
Symbol table '.symtab' contains 13 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     6: 00000000006000b8     4 OBJECT  GLOBAL DEFAULT    2 b
     7: 00000000006000b4     4 OBJECT  GLOBAL DEFAULT    2 _start
     8: 00000000006000bc     4 OBJECT  GLOBAL DEFAULT    2 c
    12: 00000000006000b0     4 OBJECT  GLOBAL DEFAULT    1 a

ゼロで初期化された 4 番目の変数を追加し続けます。今回.bssのサイズが16だといいのですが、20(0x14)です。

# cat test.c && gcc -o test.o -c test.c && ld -o test test.o && readelf -Ss test
int _start=0;
int a = 2;
int b = 0;
int c = 0;
int d = 0;
......
Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 1] .data             PROGBITS         00000000006000b0  000000b0
       0000000000000004  0000000000000000  WA       0     0     4
  [ 2] .bss              NOBITS           00000000006000b4  000000b4
       0000000000000014  0000000000000000  WA       0     0     4
......
Symbol table '.symtab' contains 14 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     6: 00000000006000b8     4 OBJECT  GLOBAL DEFAULT    2 b
     7: 00000000006000b4     4 OBJECT  GLOBAL DEFAULT    2 _start
     8: 00000000006000bc     4 OBJECT  GLOBAL DEFAULT    2 c
    10: 00000000006000c0     4 OBJECT  GLOBAL DEFAULT    2 d
    13: 00000000006000b0     4 OBJECT  GLOBAL DEFAULT    1 a

結果が私の期待と一致する場合もあれば、そうでない場合もあります。リンカーの出力に影響を与える他の要因はありますか?

4

1 に答える 1

1

それは実際にはアライメントです。あなたの例の のサイズは、bss予想どおり 8 バイトに揃えられていませんが、4 バイトのdata. 別の初期化された変数を追加すると、セグメントのサイズbssが 8 バイトにアラインされていることがわかります。

于 2012-07-12T07:57:02.543 に答える