函式庫

函式库（）是在计算机科学中用于开发软件的子程序集合。库和可执行文件的区别是：它不是独立的计算机程序，而是向其他程式提供服务的程式碼。

 链接 

库链接（）是指把一个或多个库包括到程序中，有两种链接形式：静态链接和动态链接；相应的，前者链接的库叫做静态库，后者的叫做动态库。

 静态库 

静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序，将一个或多个库或目标文件（先前由编译器或汇编器生成）链接到一块，以生成可执行程序。

静态链接的最大缺点是生成的可执行文件較大，需要更多的系统资源，在載入到記憶體时也会消耗更多的时间。优点是代码执行效率高。

 共享库 

共享庫或共享對象是旨在被執行檔和其他共享共享的文件。程式使用的模組在裝載時或運行時從各個共享對象加載到記憶體中，而不是在為程式建立單一整體可執行檔時由連結器複製。

共享庫可以在編譯時靜態連結，這意味著在創建可執行檔時解析對庫模組的引用，並為模組分配記憶體。但通常會推遲到共享庫被裝載時才進行連結。

  动态链接库  

动态链接是在可执行文件装载时或运行时，由操作系统的装载程序加载库。大多数操作系统将解析外部引用（比如库）作为加载过程的一部分。在这些系统上，可执行文件包含一个叫做匯入目錄（import directory）的表，该表的每一项包含一个库的名字。根据表中记录的名字，装载程序在硬盘上搜索需要的库，然后将其加载到内存中预先不确定的位置，之后根据加载库后确定的库的地址更新可执行程序。可执行程序根据更新后的库信息调用库中的函数或引用库中的数据。这种类型的动态加载称为装载（load-time）时加载，被包括Windows和Linux的大多数系统采用。装载程序在加载应用软件时要完成的最复杂的工作之一就是加载时链接。

其他操作系统可能在运行时解析引用。在这些系统上，可执行程序调用操作系统API将库的名字、函数在库中的编号和函数参数一同传递。操作系统负责立即解析然后代表应用调用合适的函数。这种动态链接叫做运行时链接。因为每个调用都会有系统开销，运行时链接要慢得多，对应用的性能有负面影响。现代操作系统已经很少使用运行时链接。

可以动态链接的函式庫，在Windows上是Dynamic Link Library（DLL），在UNIX或Linux上是Shared Library。库文件是预先编译链接好的可执行文件，存储在计算机的硬盘上。大多数情况下，同一时间多个应用可以使用一个库的同一份拷贝，操作系统不需要加载这个库的多个实例。

参考文献

  Code:  Errata: 
 Article Beginner's Guide to Linkers by David Drysdale
 Article Faster C++ program startups by improving runtime linking efficiency by Léon Bottou and John Ryland
  by Baris Simsek
 BFD - the Binary File Descriptor Library
 1st Library-Centric Software Design Workshop LCSD'05  at OOPSLA'05
 2nd Library-Centric Software Design Workshop LCSD'06 at OOPSLA'06
 How to create shared library by Ulrich Drepper (with much background info)
 Anatomy of Linux dynamic libraries at IBM.com

L
H
*
Category:操作系统技术