C ++名前マングリング(装飾)決定論的ですか?
-
16-09-2020 - |
質問
管理コード付きの管理対象のC ++ DLLでロードリブラリーを希望して、マングルされたextern関数でgetProcaddressを呼び出します。私の質問は、C ++コンパイラの決定論的に取得したマングルされた名前ですか?つまり、元の署名が変更されていない場合は、常に同じマングルネームに変換された名前は?
解決
標準では指定されていません。コンパイルされたモジュール
GetProcAddress
を使用している場合は、関数をextern "C"
としてエクスポートするためのFar Cleanerになるため、それらの名前がマングルされていません。
他のヒント
他の人が言ったように、それはコンパイラ固有です。ただし、Agner Fogによって文書の詳細を見つけることができます...
http://www.agner.org/optimize/#manuals
そのページの項目5を参照してください。
また、最近、あなたのために共通のコンパイラのマングリングとデパングリングを処理できるライブラリがあります。Visual C ++の場合、開始点はDBGHELPおよびIMARDHLPライブラリです。
http://msdn.microsoft..com / ja-us / library / MS679292%28V= VS.85%29.aspx
http://msdn.microsoft..com / ja-us / library / MS680321%28V= VS.85%29.ASPX
名前マンゲリングは、すべてのコンパイラによって異なって処理されます(たぶん標準はありません)。C ++コードで純粋なC関数を使用する場合は、extern "c"を使用してC関数の名前マンゲリングをスプレッスすることで、コンパイラがそれらを見つけることができます。