2010-08-20 130 views
3

如我們所知.bss包含未初始化的變量。如果在c代碼中,程序員在使用它們之前初始化變量。那麼.bss在執行C代碼之前不必爲零。.bss部分不是零初始化

我對不對?

由於

回答

11

在C代碼,具有靜態存儲持續時間的任何變量被定義爲通過該規範(第6.7.8初始化,第10段)被初始化爲0:

如果一個對象,該具有靜態存儲持續時間未明確初始化,則:

  • 如果它有指針類型,則它被初始化爲空指針;
  • 如果它有算術類型,它被初始化爲(正或無符號)零;
  • 如果它是一個聚合,每個成員根據這些規則初始化(遞歸);
  • 如果它是一個聯合,則根據這些規則初始化(遞歸)第一個命名成員。

一些程序加載器將填補用零整節開始,和其他人將填補其「按需」爲演出內容的改進。所以,當你在技術上是正確的,因爲.bss部分可能不真的包含全零的C代碼開始執行時,邏輯一樣。無論如何,假設您有一個符合標準的工具鏈,您可以將其視爲全零。

被初始化爲非零值在.bss部分永遠不會結束了任何變量;它們在.data.rodata部分處理,具體取決於它們的特性。

1

這取決於變量在代碼中的位置。例如,如果你正在討論main()或其他函數中的局部變量,那麼變量會被壓入堆棧(除非使用其他修改關鍵字)。如果你的變量是全局和未初始化的,那麼它應該保存在.bss中。請注意,編譯器優化等可能會改變一些事情。如果你確實想知道使用readelf來調查linux上的ELF二進制文件。

+0

靜態存儲持續時間明確初始化爲0的任何變量也可能以.bss節結束。 – 2010-08-20 15:31:58

4

ELF規範說:

的.bss此節包含未初始化的數據 有助於程序的 內存映像。根據定義,當程序開始運行時, 系統使用零初始化數據 。所述 部分佔據沒有文件的空間,如由 區段類型, SHT_NOBITS指示。

它因此得出結論,其具有分配給它的值C全局變量不能被放入.bss段,將不得不進入.data段。 .data部分包含分配給它的所有變量的初始值。

-1

看起來好像你可能會對.bss部分結束零初始化的機制感到困惑。您編譯的代碼無法將區域顯式初始化爲零,因爲操作系統首先爲進程分配新頁面的內存時,操作系統會確保頁面初始化爲零。這是出於安全原因而完成的,以便進程無法查找其他進程退出時留在內存中的祕密。

+0

您假定代碼正在由操作系統運行,而不是這種情況,這就是爲什麼當某些變量需要未初始化時,它需要在.bss中。是因爲.bss IS實際上是零填充的 – 2013-03-01 00:25:15