3

Cとx86の混合アセンブリコードで構成されるアプリケーションがあります。複雑な理由から、アセンブリコードは、(プログラムカウンターと称される)値がCコードのオブジェクトコードが存在する領域のアドレスであるかどうかを知りたいと考えています。このアプリケーションは、この奇妙なチェックを含め、過去に非常にうまく機能しました。

実際に必要なのは、信頼できるアドレスを持つCコード領域の「ブックエンド」だけです。もちろん、これは、コンパイルされたCコードがロードイメージに比較的密に配置されていることを前提としています。

現在、ダミー関数のLowestAddress(){}とHighestAddress(){}を定義し、コードを含むファイルの最初と最後にそれぞれ配置することで、ブックエンドを取得しています。アセンブリコードは、対象の値をこれらの関数のアドレスと比較して、その値がCコードの範囲内にあるかどうかを判断するだけです。おっと、これは2番目の仮定をします。これは、関数がメモリ内でソースファイルのテキスト順序で順序付けられていることです。これは、以前のバージョンのVisualStudioでは明らかに当てはまります。

残念ながら、もはや、リンク時コード生成を使用してコンパイルするVS2010では確かにそうではありません。(他の[非]最適化設定が何をするのかわかりません。)VS2010で調べたところ、LowestAddress関数は明らかに他のC関数の束のオブジェクトコードの真ん中にあります。

これらのブックエンドを(再)実装するにはどうすればよいですか?ある種のセグメント制御?VS 2010でのビルドに使用できるオプションは、有用なものを提供していないようです。(本当に賢いコンパイラーは、コールグラフに基づいてキャッシュラインの競合を最小限に抑えるために実際にコードを再配置する可能性があることを理解しています。MSは実際にそれほど賢いですか?)私は、この領域のすべての関数をテキスト順に並べることを強く主張しているわけではありません。領域の上限と下限が必要です。

[[グローバル]コールグラフを作成できる唯一の場所であるリンク時のコード生成をオフにして、どのような効果があるかを確認します。]

4

1 に答える 1

2

/ORDERコンパイラ パラメーターを使用して、関数をイメージに配置する順序を指定できます。

于 2012-10-22T13:56:43.183 に答える