1

私は Windows バイナリ用のリンカーを作成しており、現在 COMDAT の実装に取り​​組んでいます。COMDAT セクションの 3 つのレコード (セクション ヘッダー、セクション シンボル、および補助シンボル) を除いて、仕様のほとんどを理解していると思います。仕様では、それらのいずれにも保存されている共通名について言及していないようです。

つまり、そのようなオブジェクトに対して dumpbin を実行すると、次のような出力が得られます。

SECTION HEADER #8
.text$mn name
       0 physical address
       0 virtual address
       5 size of raw data
    2358 file pointer to raw data (00002358 to 0000235C)
    235D file pointer to relocation table
       0 file pointer to line numbers
       1 number of relocations
       0 number of line numbers
60301020 flags
         Code
         COMDAT; sym= cosl

最後のアイテムはどこsym= coslから来たのですか?あるいは、セクションを指しているのが通常のシンボルである場合、そのセクションを指しているそのようなシンボルが複数ある場合はどうなるでしょうか?

4

1 に答える 1

2

Microsoft PE and COFF Specificationのセクション 4.5.6 (リンカーを作成している場合はよく読んでいると思います) によると、sym= 値はCOMDATシンボルであり、リンカーによって使用されます。最終イメージに保持する COMDAT セクションのコピーを決定する選択値。各 COMDAT セクションのシンボル テーブルには 2 つのエントリがあります。最初のレコードには、セクション名と選択情報を含む補助レコードがあります。COMDAT シンボル値は、COMDAT セクションのシンボル テーブルの 2 番目のエントリから取得されます。これは、シンボルの ShortName 値か、シンボルが指す文字列テーブル エントリの値のいずれかです。

COMDAT シンボル値は、リンクされるさまざまなオブジェクト ファイル内の同じ COMDAT のすべてのコピーに対して同一である必要があります。仕様を正しく理解していれば、1 つのオブジェクト ファイル内の特定の COMDAT セクションに対して、一致する SectionNumber を持つシンボル テーブル エントリは 2 つだけである必要があります。1 つの COMDAT のシンボル テーブル エントリとして、値が異なる複数の COMDAT シンボル文字列が表示されることはありません。

于 2014-03-13T20:07:56.577 に答える