c파일로 작성된 프로그램 a.c, b.c를 각각 컴파일하여 a.obj, b.obj의 오브젝트 파일이 나왔고, 각각 코드 안에 extern키워드로 외부 참조가 있으면 obj파일 안에서는 해당 extern 키워드에 대한 real value값을 모른다.
링커가 해당 파일들을 하나로 묶은 실행파일 a.out에 대해서 들어가야 외부 참조 변수/함수에 대한 값을 알 수 있다.
그러나, "코드를 잘 짜는" 사람들은 프로그램 scale이 커질 수록 확장성 이슈 때문에 하나의 헤더파일을 관리하는 별도의 라이브러리 파일을 만들어서 관리한다. libc.a 라이브러리 파일 안에는 해당 함수를 정의한 x.h라는 헤더 파일이 있고, c로 코드를 작성할 때 #include "x.h"로 작성하면 된다.
그런데 이런 라이브러리는 또 Binding time에 따라서 2가지로 구분할 수 있다.
하나는 [1]Binding이 compile time인, Static Linking을 지원하는 Static Library
[2]Binding이 run time인, Dynamic Linking을 지원하는 Shared Library가 있다.
Static Library는 헤더 파일을 정의한 라이브러리가 obj파일과 함께 libc.a로 링크되어, 실행 파일 내부에 박혀있는 경우이다. 이 경우에는 각 실행 파일들에 대해 라이브러리 함수가 올라가야 하므로, memory 낭비가 커진다는 것이 단점이 될 수 있으나 faster하다는 것이 장점이다.(Static Linking)
Shared Library는 헤더 파일을 정의하는 라이브러리가 실행 파일 내부가 아닌, 실행 시에 linking되는 경우이다. 이 경우 하나의 copy로 여러 프로세스가 접근할 수 있고, memory 공간 낭비가 적다는 장점이 있다. 그러나, initial bookeeping하는 데에 overhead가 발생할 수 있고, shared library가 없는 다른 사용자들은 온전하게 실행할 수 없으며, 다소 slower하다는 단점이 있다.