当系统执行一个依赖动态库的可执行程序时,系统不仅要将该可执行程序加载到内存中还要由加载器将动态库加载到内存中(静态库没有),因此必须要让加载器知道该动态库的名称,系统会默认在/lib64路径下查找,解决动态库加载时加载器找不到库文件的问题在这篇文章的末尾有4种解决方案:http://t.csdnimg.cn/UH1AI
动态库被加载到内存中后,会被多个进程共享。也就是说当需要执行多个含同样的动态库的可执行程序时,只需要将该动态库加载一次到内存即可,不需要加载多次。系统会知道该动态库是否已经加载到了内存中。
编译器通过编译链接之后得到可执行程序,此时的可执行程序内部存储的其实已经是各语句和各数据对应以及它们对应的在进程地址空间里的虚拟地址,也就是说当可执行程序加载到内存的那一刻,可执行程序里的代码和数据把自己的虚拟地址全部填入了地址空间里,由于可执行程序一般将数据加载到物理内存中一般采取的是惰性加载机制,即不会一次性全部加载,会慢慢的将自己的代码和数据加载到内存中。当CPU指令执行到可执行程序里的动态库的虚拟地址指令时(即动态库里的函数数据的虚拟地址),CPU执行发生如下跳转:
同一动态库在不同进程中虚拟地址的虽然不同,但是可以通过页表映射得到该动态库的物理地址,进而实现多个进程共享一个动态库。