3

これ

en.wikipedia.org/wiki/Hot_swapping#cite_note-1

VSはデバッガーの助けを借りてそれを行うことができると言います。gdbは同様の機能を提供しますか?

これは私が見つけることができる最も近いものですが、使用する準備ができていないようです:

http://www.aitdspace.gr/xmlui/handle/123456789/219

dlopen / dlsym / dlcloseも近いですが、-lmylib参照ライブラリでは機能しません(参照カウントが0になることはありません)。

私が検討した代替案:

1)-Wl、-wrap、fooを使用し、__ wrap_foo(){func = dlopen(); func(); }

2)libfoo.soを共有ライブラリにし、ホットスワップが必要な場合は、dlopen(RTLD_GLOBAL)を使用して新しいコードをロードし、foo()の次の呼び出しに更新されたシンボルを提供します。

1)ホットスワップしたいすべての関数を列挙する必要があるため、うまく機能しません。これらはすべてです。

2)foo()が呼び出されると、新しいコードがロードされるため、うまく機能しませんが、fooはそのシンボルへの参照を永久に保持します。dlopenを複数回呼び出すと、fooが再評価されます。

4

3 に答える 3

2

あなたはKspliceに興味があるかもしれません。これはMITから生まれたテクノロジーであり、再起動せずにソフトウェアパッチをLinuxカーネルに適用できます。これは、セキュリティ更新プログラムの適用に最も関連があります。

http://www.ksplice.com/paper

于 2010-10-20T00:10:26.087 に答える
0

関数ポインタのリストを格納するシステムをハックして、その時点でdlopen()を使用していたライブラリを指すようにこれらのポインタを変更することもできます。

そうです、固定リンケージを持つルーチンへの呼び出しを傍受する簡単な方法はありません。別のルーチンへのアセンブリジャンプでルーチンの開始をいつでも壊すことができますが、それは危険な場合があります(Cではありません)。

たぶん、あなたのコードに弱く、dlopen()されたライブラリに強いシンボルが機能するでしょうか?

これらのいずれの場合でも、古いコードが現在実行されている状況に対処する必要があります。スワップしたいライブラリにスレッドがないことがプログラムにわかっていない限り、これも簡単ではありません。

于 2010-10-19T23:40:54.080 に答える
0

私が見つけた最も近いものは、oracle開発者スタジオに付属するsolari dbxですが、dev studioはLinuxとsolarisの両方でdbxを使用しますが、solarisバージョンのみが「編集して続行」または「ホットコードスワップ」をサポートします

于 2018-04-04T01:41:40.150 に答える