2015-10-15 10 views
11

LLVMのソースコードでbugfixを見ている間に、私は「仮想セクション」という言葉に出会い、それが何を意味しているのか疑問に思っていました。オブジェクトファイルのコンテキスト内のLLVM仮想セクションとは何ですか?

私はいくつかの異なる用語を検索し、さらにソースコードをブラウズしようとしましたが、各オブジェクトファイル形式の実装が、内容がない場合はセクションが仮想であることを表すように見えます.bssセクションなどですが、ソースコードはこれらが2つの異なる概念であることを明確に表しています)。実装は、関連する特定のオブジェクト形式によって異なります。

私はオブジェクトファイルの内部を理解するのがかなり新しいので、これがLLVMのものか、より一般的な概念であるかはわかりません。

誰かがオブジェクトファイルに仮想セクションが何であるか教えてください。

答えて

1

LLVMソースコードのコメントによると、「仮想セクション」はオブジェクトファイル内にデータを持たないセクションです。 (PE/COFF仕様にはそのような用語がないため、おそらくLLVMでのみ使用されます)。

.bssセクションには初期化されていないデータしか含まれていないため、オブジェクトファイルにはデータはありません(理論的には可能ですが)。 (

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

しかし、事はLLVMはマッハ-Oファイル内の「仮想」のセクションをサポートしていないということです。だから、.bssセクションでは、「仮想」であるべきであり、そこにLLVMに次のコードを持ってする必要はありませんまたは多分マッハ-Oファイルは、それらを持つことはできません)

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

したがってLLVMはisBSSisVirtualに別々のチェックを持っています。

A BSSセクションは次のような

  • 可読
  • 書き込み可能
  • 非実行
  • 未初期化データ

仮想セクションは、異なる特性を有し、ケースを使用する場合があり、書き込み可能+実行可能、またはBSSではない非読み込み(整列)セクション(書き込み可能+実行可能セクション安全ではなく、「整列」セクションは、コード保護(アンチダンプ)トリックにのみ有効です。

すべてのBSSセクションは仮想セクションですが、すべての仮想セクションがBSSセクションではありません。

+0

確かに別々の小切手は、これらが実際に異なる概念であることを示していますか?さもなければ、 'isBSS'と' isVirtual'が存在する必要はありません。関係なく、あなたの入力をありがとう! – OMGtechy

+0

@OMGtechy答えを更新しました。 – Abyx

+0

ありがとう、それははるかに良いです! – OMGtechy

関連する問題