• 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候不再需要静态库。静态库会被链接到可执行文件中,比较占用磁盘空间,并且执行时会将库的代码加载到内存,占用更多的内存,并且多个程序无法共享。
  • 共享库(.so 或 .sa):程序在运行的时候才去链接共享库的代码,多个程序可以共享使用库的代码。共享库可以在多个程序间共享,所以动态链接使得可执行程序文件更小,节省了磁盘空间,操作系统采用虚拟内存机制允许物理内存中的一份共享库被要用到该库的所有进程共用,节省了内存和磁盘空间。

一个与共享库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数在目标文件的整个机器码。

在可执行文件开始运行以前,外部的机器码由操作系统从磁盘上的该共享库中复制到内存中,这个过程成为动态链接(dynamic linking)。