1

私はファイルptr.cを持っています

a@po:~/code/link_load$ cat ptr.c
int test()
{
     printf("in test1 %p\n",&test);
    return 0;
}

として共有ライブラリを作成しました

a@po:~/code/link_load$ gcc -fPIC -c ptr.c
a@po:~/code/link_load$ gcc -shared -o libptr.so ptr.o                                                                       

次に、2 つのプログラム p1.c と p2.c から test を呼び出します。どちらも test を呼び出し、p1.c は test を呼び出した後にスリープして、両方の実行可能ファイルが一緒にアクティブであることを確認します。

テキスト セクションは共有されているため、テスト関数のアドレスは同じであると予想していました。

しかし、そうではありません、なぜですか?

編集:印刷されたアドレスは仮想アドレスだと思います。それが真の場合、実際のアドレスにマップされ、p1 と p2 の両方で同じになります。

4

1 に答える 1

2

1 つのファイル (ライブラリのテキスト セクションなど) を、共有しながら、複数のプロセスで異なる仮想アドレスにマップできます。それがここで起こっていることです。

于 2015-05-16T20:43:36.897 に答える