2011-03-26 43 views
2

對於未初始化的全局變量在ELF文件中的位置,我有點困惑。我有這個簡單的程序測試,其中部分變量將位於:未初始化的全局數據部分是什麼?

const int a = 11; 
int b = 10; 
int c; 

int main() 
{ 
    return 0; 
} 

我知道,未初始化的全局變量應該放在ELF文件的.bss段,但objdump的-H給我下面的輸出:

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .text   0000000a 00000000 00000000 00000034 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
    1 .data   00000004 00000000 00000000 00000040 2**2 
        CONTENTS, ALLOC, LOAD, DATA 
    2 .bss   00000000 00000000 00000000 00000044 2**2 
        ALLOC 
    3 .rodata  00000004 00000000 00000000 00000044 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, DATA 
    4 .comment  00000024 00000000 00000000 00000048 2**0 
        CONTENTS, READONLY 
    5 .note.GNU-stack 00000000 00000000 00000000 0000006c 2**0 
        CONTENTS, READONLY 

所以變量a轉到.rodata,b轉到.data,c無處可去?當我改變代碼:

int c = 0; 

一切都如預期 - .bss段具有長度爲4,但與變量c會發生什麼時,未初始化的呢?

回答

1

它進入「共同部分」。您可以通過objdump -t或使用nm來查看。

我不太確定我明白這是怎麼回事,但參考ld-warn-common標誌這樣說:

int i; 

常見的符號。如果 變量只有 (一個或多個)通用符號,則它將進入輸出文件的未初始化的 數據區域。鏈接器將用於相同變量的多個通用符號 合併成單個的 符號。如果它們的尺寸不同,它會選擇最大的尺寸。如果存在相同變量的定義 ,則鏈接器將公共符號變成 聲明。

(通過nm手冊頁找到。)有後,在男子頁本身的更多信息。

+0

我看到了......所以加載程序知道需要爲「常見」變量保留多少空間的唯一方法是查看ELF文件中的符號? – bialpio 2011-03-26 18:40:27