簡體   English   中英

為什么對象(ELF)文件中.bss節沒有內容?

[英]Why is there no content for the .bss section in an object (ELF) file?

這個問題使我很困惑。 據我所知,.bss部分用於保存已初始化但尚未使用的數據。 但是我不明白這里的“內容”是什么意思,為什么這里沒有內容?

感謝您的幫助!

BSS(以符號開頭的塊)部分中沒有內容,因為這將浪費存儲空間。 BSS的內容全為零,並且在調用main之前由啟動代碼清除。 將BSS視為運行長度壓縮字節塊。 解壓縮該塊所需的全部就是值(0)和長度,該值存儲在BSS的ELF條目中。

您對“ [已初始化但尚未使用的數據””的概念有些偏離。 考慮一下ELF文件中的所有部分都以某種方式“尚未使用”。 文本段可能會或可能不會被使用(它可能包含無效/無法訪問的代碼)。 數據段可以使用也可以根本不使用(您可以定義代碼從未使用過的對象)。

快速的響應是:嗯,沒有內容可以用.bss填充,因此與該部分相關的任何數據都沒有放入可執行文件中是沒有意義的。 僅存儲變量的位置,但是屬於另一個ELF部分。

.bss部分是程序中所有未初始化變量的位置(默認情況下,所有這些變量均初始化為零)。鏈接程序僅需要知道該區域的實際大小和實際變量位置,而無需知道值,因為其內容顯而易見,並且獨立變量的性質或分布。

加載程序時,內核通常會為程序的不可修改文本分配一個只讀段( .text節),並將初始化的const變量的內容( .rodata段)放入該段中,以防您嘗試在那里修改某些內容,您將獲得一個例外。 然后是初始化數據部分,其中包含程序的所有初始化變量的初始值( .data部分)和未初始化變量的初始值( .bss部分)

數據段(看看我如何稱呼不同的段和負載段)具有更多的空間,即.data.bss段的總和,以容納所有變量(都包括在內,因此這就是它使用其長度的原因)但是,雖然.data節的內容必須從文件中填充,但.bss節的內容卻不需要,因為在允許用戶進程訪問分配的段之前,所有內容都已由操作系統清零。 對於小型系統而言,情況並非如此,在小型系統中,操作系統不會用零填充數據。但是,在那兒,編譯器向所有.bss段添加了一些代碼以將其歸零,因此,再次不需要從.bss段復制任何數據。可執行文件。

此行為的歷史(也是主要)原因是,內核分配的必須隨程序一起加載的頁面出於安全原因而被清除為零(因此,您很幸運地無法獲得包含其他用戶密碼或其他信息的頁面明智的信息),因此沒有理由再次用零填充並且無需在此處復制任何內容,也沒有理由在可執行文件上放置任何內容。 內核通常維護的頁面只有在將要提供給用戶時才會歸零,但會維護信息(因為它們是為此目的而設計的),直到被覆蓋為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM