2

PostScript インタープリターにクイック起動機能を追加して、長い (-ish) 初期化ルーチンをバイパスし、ユーザー プログラムをすぐに実行できるようにしたいと考えています。そのため、すべてのインタープリター メモリがメモリ マップト ファイルに含まれるように設計しました。このメモリへのすべての内部「ポインタ」は、実際には、ベースポインタからメモリ ファイルの先頭までの整数バイト オフセットです。ということで、デザイン的にはそこまでは覚悟していたと思います。

私の懸念は、関数ポインタを含む演算子テーブルにあります。C 自体はこの領域で何の保証もしていないと思いますが、静的にリンクされた関数への関数ポインターは、同じ実行可能ファイルを個別に実行しても同じままであると想定できますか? これは仮想メモリの存在に依存しますか? POSIX はこれに対応していますか?

Cygwin では、毎回同じポインター値を取得しているように見えます。しかし、テストによってバグがないことを証明することはできません

編集:私の弁護では、ここでの目標は効率だけではありませんでした。メモリ使用量をカプセル化することは、より大きな目標でした (チーズとしてクイック起動を使用)。カプセル化は、デバッグにも非常に役立ちました。

4

1 に答える 1

1

多分。それに頼らないでください。

Mat がコメントしたように、ASLR はアドレスをランダム化します。したがって、有効にすると、同じポインターは得られません。
それがなければ、同じポインタを取得する可能性があります。ただし、環境の小さな変更 (使用しているライブラリのパッチなど) でこれが壊れます。したがって、非常に信頼性の低いプログラムになります。

于 2013-08-04T07:41:03.287 に答える