3

Unix で実行されているプログラムにコンパイルされた関数 foo() があるとします。

プログラムの実行中に、変更されたバージョンの foo() を含むオブジェクト ファイルを動的にロードすることにより、関数 foo を「置き換える」ことができますか?

私が過去に取り組んだ組み込みシステムでは、テキスト セグメントの保護を解除してから、基本的に foo() のアドレスを「パッチ」して、新しく変更された foo() を指すようにすることができました。

これは、顧客のサイトで時折、多くの特別な制約を伴うデバッグに使用されました。

これは Unix で可能ですか?

4

3 に答える 3

1

はい。結局のところ、これが gdb のようなデバッガーの仕組みです。

于 2010-02-02T01:48:16.937 に答える
1

環境にもよると思います。生産コードのホットスワップは、Erlang モジュールでは些細なことであり、Ruby ではそれほど難しくないことを私は知っています。Cは別の動物かもしれません。

于 2010-02-02T01:37:12.153 に答える
0

もちろん可能です。質問は本当に「どれくらい難しいですか?」であるべきです。

Linux と Windows で必要なすべての共有ライブラリ (.so と .DLL) をロードおよびアンロードできます。UNIX の特定のバリアントについては、よくわかりません。これは、目標を達成するための最も簡単な方法です。

手を汚してもかまわない場合は、いつでもコード セグメントにパッチを適用して、ヒープの別の場所にジャンプできます。お勧めしません。

于 2010-02-02T01:42:45.437 に答える