“〜”のソートされたビットベクトルフィールドの目的は何ですか? .NETアセンブリのメタデータヘッダー?
質問
Partition IIメタデータによると、有効なフィールドは.NET実行可能ファイルに存在するCLRメタデータテーブルを示すビットマスクであると言いますが、私が理解できないのは「ソート済み」のものですフィールドの目的は何ですか?その意味は何ですか?また、独自の.NETポータブル実行可能イメージを作成するときにこのフィールドに何を出力する必要がありますか?
解決
特定のメタデータテーブルが並べ替えられているかどうかにかかわらず、並べ替えられたフィールドはヒントになっていると思います(有効なビットフィールドです)。
これにより、ランタイムの実装により、マップされたデータから直接テーブルでバイナリ検索を実行できます。
他のヒント
編集:これは回答ではなく、ソートされたフィールドではなく有効なフィールドに関する質問と誤解していますが、回答に関連する場合はここに残します
"有効な"あなたが話しているフィールドは、パーティションII 、§ 24.2.6、関連する部分は次のとおりです。
有効なフィールドは、ストリームに格納されている各テーブルに特定のビットが設定された64ビットのビットベクトルです。テーブルのインデックスへのマッピングは§ 22の開始時に指定されます。たとえば、論理メタデータにDeclSecurityテーブルが存在する場合、有効なベクトルにビット0x0eを設定する必要があります。 Validに存在しないテーブルを含めることは無効であるため、0x2cより上のすべてのビットはゼロでなければなりません。
§ 22.2で始まるセクション22の各サブセクションでは、1つのテーブルについて説明し、ビットインデックスを示します。たとえば、§ 22.2は「Assembly:0x20」というタイトルです。つまり、§ 22.2で説明されているアセンブリテーブルがPEに存在する場合にのみ、 Valid
フィールドにビット0x20を設定する必要があります。これは、有効な& 0x20 == 0x20
、つまり、 Valid
の0x20番目(つまり32番目)のビットを設定する必要があることを意味します。つまり、 Valid& (1<< 0x20)==(1<< 0x20)
。
しばらくの間、0インデックス付きか1インデックス付きかはわかりませんでしたので、0インデックス付きと想定しました。しかし、Moduleテーブルはテーブル0x00であるため、インデックスが0であることは確実にわかりました。