2012-07-12 14 views
1

我想知道鏈接器如何計算.bss節的大小?鏈接器如何計算.bss段的大小?

我有一個測試程序有兩個變量,一個是初始化爲零,另一個是初始化爲非零的 。我希望.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 

然後我添加第二個零初始化變量。這次我希望.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 

我繼續添加第三個零初始化變量。這次我希望.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 

我繼續添加第四個零點啓動變量。這次我希望.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 

有時結果與我的預期相符,有時不符合。 是否有其他因素影響鏈接器的輸出?

+0

對齊可能嗎? – cnicutar 2012-07-12 07:54:58

+0

檢查第二個LOAD段的memsz是否符合您的期望。 – JohnTortugo 2012-09-26 18:40:39

回答

1

它實際上是對齊的。您示例中的bss的大小不像您期望的那樣對齊8字節,但這是因爲您有4個字節的data。如果添加另一個初始化變量,則會看到bss段的大小爲8個字節對齊。

+0

'我不確定你爲什麼期望5個變量是16個字節.'在這5個變量中,一個以非零值啓動,並放入.data,另外4個變量是零啓動的,並放置在.bss中,所以我期望16個字節。 – 2012-07-12 08:03:55

+1

看到我修改後的答案,它實際上是一致的。 – 2012-07-12 08:27:46