プロセスが動的ライブラリの関数を必要とする場合、ライブラリ全体がメモリにロードされますか、それとも関数だけがロードされますか?
例: printf()
libc (動的ライブラリであると仮定) の関数または任意の関数を使用する場合、libc 全体がメモリにロードされますか、それともprintf()
関数のみがロードされますか?
ライブラリ全体がメモリにロードされますか、それとも関数だけがロードされますか?
答えは、「メモリにロードされた」とはどういう意味か、およびプログラムを実行しているオペレーティング システムによって異なります。
Linux と に対する典型的なリンクを考えてみましょうlibc.so
。
そこでは、プログラムの最初の命令が実行される前に、およびofをPT_LOAD
含むセグメント全体がメモリに書き込まれます (プログラムはそのセクションで必要な情報を記録するため)。.data
.text
libc.so.6
mmap()
libc.so.6
.dynamic
それ以降は、アクセス時にコードがRAM に要求されてページングされます。を呼び出すとprintf
、 のコードを含むページがprintf
ディスクからページインされるか、(より可能性が高い) バッファ キャッシュから再利用されます。