"i"がグローバル変数であるこの関数で共有ライブラリがあるとします。共有ライブラリのグローバル変数はどのようにリンクされていますか?
int foo() {
return i++;
}
私は複数のプロセスからこの関数を呼び出すと、各プロセスでの「i」の値が他のプロセスには無関係です。
この動作はかなり予想されます。
私はこの動作がリンカによってどのように実装されているのだろうかと疑問に思っていましたか?私の理解から、コードはプロセス間で共有されるので、変数はこのライブラリを使用するすべてのプログラムのすべてのアドレス空間に同じ仮想アドレスを持つ必要があります。その状態は私には達成するのが難しいようですので、私はここで何か不足していると思います。
このテーマに関する詳細情報はありますか?
**コード**は**データではなく**共有されています**ダイナミックリンカーは、おそらく各プロセスの変数の新しいコピーを作成しますが、テキスト(コード)セグメントのコピーは作成しません。 –
@ H2CO3私はそれをよく知っています。しかし、私はリンクのプロセスの詳細について尋ねています。 –
詳細が必要な場合は、実際の実装を見てください。 Linuxの動的リンカーとDarwinのもの(BSD/OS X/iOS)はopensourceです。 –