2012-05-02 67 views
8

已知.bss段不存儲在磁盤中,但內存中的.bss段應初始化爲零。但它在內存中應該在哪裏? ELF標題中是否顯示任何信息,或者.bss部分是否可能顯示在數據部分的旁邊,或其他內容?ELF文件的.bss節應該在哪裏進入內存?

回答

10

知道在哪裏BSS段會在內存中,它足以運行readelf -S program,並檢查Addr.bss行。

在大多數情況下,你也將看到初始化數據段(.data)立即之前。也就是說,你會看到地址+尺寸的.data部分的.bss段的起始地址相匹配。

但是,情況並非總是如此。這些都是歷史慣例,並且ELF specification(與平臺相關的補充文件一起閱讀,例如32-bit x86 machines中的第5章)允許更復雜的配置,並不是所有配置都受Linux支持。

例如,部分不得稱爲.bss可言。唯一2個特性,使得一個BSS部分如:

  1. 的部分標有SHT_NOBITS(即,它需要空間在存儲器中,但沒有上的存儲),這顯示爲在readelf的輸出NOBITS
  2. 它映射到可加載(PT_LOAD),可讀(PF_R)和可寫(PF_W)段。存儲器中的這種段也比存儲器中短(p_filesz < p_memsz)。

你可以有多個BSS部分:PowerPC的可執行文件可能有未初始化的數據變量.sbss.sbss2

最後,BSS部不一定是相鄰的數據段或堆。如果您檢查Linux kernel(更特別是load_elf_binary函數),您可以看到BSS部分(或更確切地說,它映射到的segment)甚至可能與代碼和初始化數據交錯。 Linux內核設法對此進行分類。

14

BSS是數據和堆之間,如在this marvelous article詳述。

enter image description here

可以使用size找出各部分的尺寸:

[email protected]:~$ size try 
    text data  bss  dec  hex filename 
    1108  496  16 1620  654 try 
+0

沒錯+1的那篇文章確實ü發佈一個偉大的 – abhi

+0

+1你還在32位的爺爺? – JeremyP

+0

等待所有64位炒作結束:-)) – cnicutar

相關問題