2012-02-24 1 views
3

MASMが関数のCOMDATを生成する方法はありますか?そのため、リンカーは未使用の関数を削除しますか?MASMアセンブリの「機能レベルのリンク」(つまりCOMDAT生成)ですか?

(つまり私はMASMのため/Gyの同等物を探しています。)

+0

ソースコードごとに1つの機能を持つアセンブリコードが常に表示されますが、これは同じ効果があります。 –

+0

@BenVoigt:そうすることは実用的ではありません。 – Mehrdad

+0

関数が呼び出されていない場合は、関数が実行可能ファイルにリンクされていないか、何かを誤解していますか?ソースファイルに20個の関数があり、それらのうちの10個だけを使用すると、あなたのexeには10個しかありません。 – Gunner

答えて

1

単純明快、なんとかわけではありません。 hereおよびhereを議論した。

最初の手順では、各関数を.text $ a、.text $ bなどの名前で別のセグメントに配置します。このようにして、アセンブラはそれらを単一の.textセクションに結合しませんが、リンカ最終的にはそうです。マイクロソフトのリンカーには、セクション名の$文字を超えたものに関する特別なルールがあります。アセンブラは複数のコードセクションを持つ.objファイルを出力します。私はそれを試みました、私はそれが確認できます。少なくとも1つのMASMのフレーバーがあります。 :)

次に、セクションをCOMDATとしてマークするオブジェクトファイルに対してユーティリティを実行することをお勧めします。このユーティリティは、時間とビットの崩壊に失われているように見えますが、その動作はおおよそ推測できます。これは、COFF .objファイルを読み込んで解析し、セクションを通過し、すべての.textセクションのCOMDATフラグをスラップします。私はそれが単なる旗だと思う。より多くなる可能性があります。そのレクリエーションの第一歩として、私は/ Gyを使用せずにCファイルをコンパイルし、2つの.objファイルを低レベルのPE/COFFブラウザで比較することをお勧めします。私のシナリオはかなり違っていたので、これまでは行っていませんでした。