2015-10-15 42 views
11

雖然在LLVM源代碼中查看bugfix,但我遇到了「虛擬節」這個詞,並想知道它的含義。什麼是對象文件上下文中的LLVM虛擬節?

我試着用谷歌瀏覽幾個不同的術語並進一步瀏覽源代碼,但是我發現所有的設計都是每個目標文件格式的isSectionVirtual成員函數的實現似乎表示一個節是虛擬的,如果它沒有內容如.bss部分,但源代碼明確表示這是兩個不同的概念)。實現取決於所涉及的特定對象格式。

我對理解目標文件的內部相當陌生,所以我不確定這是LLVM還是LLVM之外的一般概念。

有人能告訴我一個虛擬部分是在一個目標文件中嗎?

回答

1

根據LLVM源代碼中的註釋,「虛擬部分」是在目標文件中沒有任何數據的部分。 (PE/COFF規範沒有這樣的術語,所以它可能只用於LLVM)。

.bss節只有未初始化的數據,所以它不應該在目標文件中有任何數據(儘管理論上它可以)。所以.bss部分應該是「虛擬」的,並沒有必要在LLVM以下代碼:

if (Sec.isBSS() || Sec.isVirtual()) 

但問題是,LLVM不支持的Mach-O文件「虛擬」的部分(也許Mach-O的文件不能讓他們)

bool MachOObjectFile::isSectionVirtual(DataRefImpl Sec) const { 
    // FIXME: Unimplemented. 
    return false; 
} 

因此LLVM有isBSSisVirtual單獨檢查。

甲BSS部分是:

  • 可讀
  • 可寫
  • 非可執行
  • 未初始化數據

虛擬部分可能具有不同的性質和使用的情況下,如可寫+可執行文件,或不可讀(對齊)部分不是BSS(請注意,可寫+可執行部分是不安全的,「對齊」部分僅用於某些代碼保護(防轉儲)技巧)。

因此,每個BSS部分都是虛擬部分,但不是每個虛擬部分都是BSS部分。

+0

當然,單獨的檢查表明這些實際上是不同的概念?否則,只會有'isBSS'和'isVirtual'不需要存在。感謝您的輸入! – OMGtechy

+0

@OMGtechy我更新了答案。 – Abyx

+0

謝謝,這太好了! – OMGtechy