9

バイナリ変換 (再コンパイル) に関して言えば、静的バイナリ変換よりも動的バイナリ変換の方がはるかに優れているとよく耳にしますが、この背後にある理由を理解できないようです。エミュレーションで静的バイナリ変換を実装することは不可能であると常に考えられているのはなぜですか? 動的バイナリ変換が常により実用的であると考えられるのはなぜですか?

多くの場合、これを JIT (ジャストインタイム) と静的コンパイルの関係と比較しますが、どちらも実用的な実装以上のものがあるため、この比較はしばしば私を混乱させます。

4

1 に答える 1

15

これは、マシン コードをあるアーキテクチャから別のアーキテクチャに変換する必要がある場合に発生します。静的に行うには、コードを表すプログラムの部分を正しく識別でき、バイナリ イメージ内の実際のデータであるビットによって混乱しないことが必要です。多くのコンパイラはこれを簡単に行うことはできません。これは、実行可能ファイルを逆コンパイルしようとした人なら誰でも知っていることです。

簡単な例は、C の switch ステートメントから生成され、実行可能コードと共に .text セグメントにコンパイルされたジャンプ テーブルです。このテーブルには、コードではなくアドレスが含まれています。これらのバイトをアドレスとして解釈するには、コンパイラに組み込まれているコード ジェネレータについてよく知っている必要があります。不可能ではありませんが、もちろん、別のコンパイラによって生成されたコードではうまく機能しません。または、同じコンパイラの別のバージョンですら。

動的変換の問題ではありません。マシンが実行しようとしているため、バイトのチャンクがコードであることがわかります。

ジッターには別の考慮事項が適用されます。中間コードは簡単に識別できるように設計されているため、このようなトランスレーターはコードの識別に問題が生じることはありません。そのような場合、動的変換は、変換のオーバーヘッドを時間の経過とともに分散させ、プログラム実行の一時停止を減らすことができるため、望ましいものです。また、決して実行されないコードで作業を行うことは完全に避けてください。

于 2013-05-23T22:29:01.333 に答える