Linux共享库概述
共享库是一种将库函数打包成一个单元使之能够在运行时被多个进程共享的技术。这种技术能够节省磁盘空间和RAM。
在继续阐述共享库之前,先来说说静态库,它是比共享库更早的存在。静态库也称为归档文件,它的作用就是将一组经常被用到的目标文件组织进单个库文件,这样以来,就可以使用它来构建多个可执行程序,并且在构建各个应用程序的时候无需重新编译原来的源代码。
从以上的描述中,可以看出,静态库必须和可执行文件一起被链接进目标文件中,这样的话,不同的可执行程序使用了相同的目标模块时,每个可执行程序都有自己的一份静态库副本,这样做有以下几个缺点:
- 存储同一目标模块会浪费磁盘空间,并且实际上浪费的空间还是很大的。
- 如果使用了同一模块的几个不同的可执行程序在同一时刻运行,那么每个程序会独立地在虚拟内存中保存一份目标模块的副本,从而提高了系统中虚拟内存的使用量。
- 若是需要修改静态库中的错误,那么需要重新生成静态库,再链接合并到目标文件中。
每一种新生事物的出现都是为了解决之前已经存在的问题,所以这里就引出了动态库,它就是来解决以上这些问题的:
- 共享库的关键思想就是目标木块的单个副本由所有需要这些模块的程序共享,目标模块不会被复制到链接过的可执行文件中,而是,当第一个需要共享库的木块的程序启动时,库的单个副本就会在运行时被加载进内存。当后面使用同一共享库的其他程序启动时,它们会使用已经加载进内存的库的副本。使用共享库,就意味着可执行程序需要的磁盘空间和虚拟内存更少了,这就解决了一个问题。
- 由于目标模块没有被复制进可执行文件中,而是在共享库中集中维护