問題タブ [comdat-folding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
windows - COMDAT セクション名
私は Windows バイナリ用のリンカーを作成しており、現在 COMDAT の実装に取り組んでいます。COMDAT セクションの 3 つのレコード (セクション ヘッダー、セクション シンボル、および補助シンボル) を除いて、仕様のほとんどを理解していると思います。仕様では、それらのいずれにも保存されている共通名について言及していないようです。
つまり、そのようなオブジェクトに対して dumpbin を実行すると、次のような出力が得られます。
最後のアイテムはどこsym= cosl
から来たのですか?あるいは、セクションを指しているのが通常のシンボルである場合、そのセクションを指しているそのようなシンボルが複数ある場合はどうなるでしょうか?
windows - IMAGE_COMDAT_SELECT_NODUPLICATES の目的
/Gy オプションを指定した Microsoft C++ は、リンカーが未使用の関数を省略できるように、すべての関数を別のセクションに配置します。これにより、実行可能ファイルのサイズが小さくなる場合があります。
すべての関数を異なるセクションに配置するだけでなく、各セクション COMDAT を選択 IMAGE_COMDAT_SELECT_NODUPLICATES でマークします。COMDAT の目的は、何かを複数の場所で定義できるようにすることです (リンカーは 1 つの定義を選択し、他の定義を破棄します) が、Selection 値は複数の定義を許可していません。
IMAGE_COMDAT_SELECT_NODUPLICATES の目的は何ですか? または、/Gy を指定した Microsoft C++ がコード セクションを COMDAT とマークするのはなぜですか?
c++ - 個別の機能には個別のアドレスがありますか?
次の 2 つの関数を検討してください。
それは保証されてい&foo != &bar
ますか?
同様に、
それは保証されてい&foo<int> != &foo<double>
ますか?
私が知っている 2 つのリンカーは、関数定義を一緒に折り畳みます。
MSVC COMDAT は積極的に関数を折りたたむため、同じ実装を持つ 2 つの関数を 1 つの関数に変換できます。副作用として、2 つの関数は同じアドレスを共有します。これは違法であるという印象を受けましたが、標準のどこで違法になっているのかわかりません。
Gold リンカも関数を折り畳み、 asafe
とall
設定の両方を使用します。 safe
は、関数アドレスが取得された場合でも折り返されないことを意味しますが、 はall
アドレスが取得されても折り畳まれます。したがって、gold's foldsafe
は、あたかも関数が個別のアドレスを持っているかのように動作します。
折り畳みは予想外かもしれませんし、異なるアドレスを持つ別個の (同一の実装) 関数に依存するコードがあります (したがって折り畳むのは危険です) が、現在の C++ 標準では実際に違法ですか? (この時点では C++14) (当然 as-if のsafe
折りたたみは合法です)
visual-c++ - COMDAT フォールディングの MSVC コンパイラとリンカー オプションの関係
この質問にはSOに関するいくつかの回答がありますが、私のものは少し異なります。重複としてマークする前に、試してみてください。
MSVC は常に /Gyコンパイラオプションを提供して、同一の関数を COMDAT セクションに折りたたむことができるようにしています。同時に、リンカーは /OPT:ICF オプションも提供します。これら 2 つのオプションを組み合わせて使用する必要があるという私の理解は正しいですか? つまり、前者は機能を COMDAT にパッケージ化しますが、後者は冗長な COMDATを排除します。あれは正しいですか?
はいの場合、両方を使用するか、両方をオフにしますか?