Intel Pin を使用して C++ 実行可能バイナリを計測し、興味深いイベント (関数呼び出し、スレッドの作成/終了など) を報告するマルチプロセッサ アーキテクチャ シミュレータに取り組んでいます。基本的には、イメージが読み込まれるときにすべての命令の命令デコード キャッシュを構築し、後で命令の実行を分析します。そのため、イメージ読み込み時の命令アドレスが実行時の命令アドレスと同じである (または少なくとも同期して更新される) ことが重要です。
Intel Pin API (IMG_AddInstrumentFunction など) を使用すると、エントリ ポイント、下位/上位アドレスなど、読み込まれたイメージ (実行可能ファイルと共有ライブラリ) に関する情報を取得できます。
しかし、インストルメント化されたプログラムが、ロードされたどのイメージにも属さないアドレスで命令を実行していることに気付きました。調べてみると、ダイナミック ローダー (イメージ /lib64/ld-linux-x86-64.so.2 on 64-bit Centos 6.3 ) がルーチン_dl_relocate_objectを呼び出してメモリ内のメインの実行可能ファイルを再配置していると思われます。
再配置可能なコードとそのすべての必要性を理解しています。これらの再配置がどのように/いつ発生する可能性があるか (ロード時および実行時) についての適切なドキュメント (または簡単な説明/アドバイス) へのポインタが必要なだけで、アーキテクチャ シミュレータでそれらを考慮することができます。言い換えれば、それを達成するために使用されるメカニズム(インストルメント化する必要があるライブラリ関数、条件、または存在する場合はランダム化、再配置を抑制するために使用できる g++ コンパイラ スイッチなど)。PS: x86/x86_64 アーキテクチャのみをターゲットにしています