2

サーバーとクライアントをCで記述しています。サーバーに共有ライブラリをロードしてから、ライブラリ関数ポインタをクライアントに渡そうとしています。このようにして、クライアントをコンパイルせずにライブラリを変更できます。

すべてのプロセスには独自の個別のメモリスペースがあるため、共有メモリに共有ライブラリをロードし、関数ポインタを渡してクライアントに共有メモリをマップしてから、クライアントにライブラリのコードを実行させることができるかどうか疑問に思います。サーバーによってロードされます。

4

2 に答える 2

4

定義上、共有ライブラリは共有されるため、2つのプロセスがライブラリのコードセグメントに同じ物理メモリを使用します。したがって、いくつかの危険なスキームを作成する代わりに、ライブラリと関数の名前をサーバーからクライアントに渡すだけで、クライアントはdlopen()+を使用して関数アドレスを取得しますdlsym()

この場合、データセグメントのコピーが2つあることに注意してください(ライブラリにグローバル変数または静的変数がある場合)。たとえば、サーバーstaticがライブラリ関数内に変数を設定した場合、その値はクライアントに対して変更されません。

于 2010-05-15T09:15:15.520 に答える
0

おそらく、OSが共有メモリを実行可能にすることを呼び出さない場合は、セキュリティの問題が発生する可能性があります(おそらくそうすべきです)。

しかし、そうする必要はありません。また、他のプロセスにポインタを渡してはなりません。代わりに、プロトコルで関数名またはコードポイントを指定してください。共有ライブラリメカニズムは、OSが何らかの理由で共有しないことを決定しない限り、メモリ内にライブラリのコピーが1つしかないことを意味します。OSが共有しないことを決定した場合、その理由として考えられるのは、通常、ポインター通過トリックも失敗することです。

于 2010-05-15T10:12:00.570 に答える