動的ライブラリのコードは、どのプロセス内で呼び出されるかをどのようにして知るのでしょうか?

動的ライブラリのコードは、どのプロセス内で呼び出されるかをどのようにして知るのでしょうか?

私の理解が正しければ、1つのdylibインスタンスはロード時に1つのメモリセグメントに格納され、その後共有されるようになります。コピーされない複数のプロセス間で仮想メモリを必要とします。しかし、実行時に誰が呼び出しているかをどうやって知るのでしょうか?

たとえば、プロセス名に依存するライブラリのクラス コンストラクターに問い合わせると (名前を直接渡すのではなく、実際には任意の名前を渡すことができます)、アタッチされている複数のプロセスのうち、正確にどのプロセスが呼び出されたかをどのように知るのでしょうか。

(この例では、メタ情報は秘密ではなく、単純なシステム コールで取得できるという事実は省略) / ライブラリのコードは、同じメモリ共有スキームを逆方向に (1 つのライブラリ <- 同時に複数のプロセス) 適用することはできないため、理論的には可能であるすべてのプロセス メモリの情報に依存することさえできません。これは大きなセキュリティ ホールになります。

ライブラリがプロセス固有の情報を静的プロパティとしてクラスに保存し、特定のプロセス内で共有する必要がある場合、状況はさらに複雑になりますが、すべてのプロセスで共有されるわけではありません。esそれが接続されているもの。実際、データは、クラスが自身の通常のフィールドとして認識する形式でプロセス メモリに書き込まれると想定していますが、ここでも、ライブラリのコード レベルでのプロセス認識の問題に戻りました。

答え1

一般的に、スタック (戻りアドレスの取得元)、ヒープ (データ ストレージ)、および一部の変数値またはアドレスへのポインターは、CPU レジスタに渡されます。これらのアドレスはすべて、呼び出し元の仮想メモリ内にあります。動的ライブラリ コードは呼び出し元のコンテキストで実行されるため、すべてのシステム コールは、呼び出し元が実行したかのように動作します。

私は自分の仮想空間にある自分のものへのポインターを持つ共有ライブラリを呼び出し、あなたは自分の仮想空間にある自分のものへのポインターを持つ共有ライブラリを呼び出します。

関連情報