주로 소프트웨어를 개발할 때 컴퓨터 프로그램이 사용하는 비휘발성 자원의 모임으로 간단하게 말하자면 개발을 위해 필요한 기능을 모아놓은 소프트웨어 혹은 프로그래밍에 사용할 수 있게 미리만들져 있는 함수나 변수들의 묶음
컴파일된 오브젝트 파일 형태로 존재하며 컴파일 과정(링킹 과정)에서 링킹되어 실행가능한 프로그램을 이룸
코드의 재사용이 쉬워짐
코드의 내용을 숨겨 은닉할 수 있음
컴파일 시간을 단축할 수 있음
정적링킹 방식과 동적링킹 방식에 따라 정적 라이브러리와 동적 라이브러리(=공유 라이브러리)로 나눌 수 있음
정적 링킹(Static Linking)과정에서 링커가 프로그램에 필요로 하는 부분을 lib에서 찾아 실행 파일에 복사하는 방식의 lib
확장자
windows : *.lib(무조건 정적 lib는 아님)
Linux : *.a
👍 장점 : 이식성이 좋고 안정적임
실행 파일이 정적 라이브러리를 복사해서 갖고 있기 때문에 실행할 때 라이브러리가 필요없다. (실행 파일만 있으면 프로그램이 동작함)
동적 링킹(Dynamic Linking)과정에서 링커가 라이브러리 내용을 복사하지 않고 해당 내용의 주소만 가지고 있다가 런타임에 실행 파일과 라이브러리가 메모리에서 위치 할 때 해당 주소로 가서 필요한 내용을 가져오는 방식
확장자
windows : *.dll
Linux : *.so
👍 장점
1. 실행파일의 크기가 작아지고, 여러 프로그램이 동적 라이브러리를 메모리에 올려놓고 공유해서 사용하기 때문에 메모리 자원을 효율적으로 사용
2. 수정사항이 생기면 실행 파일을 새로 컴파일할 필요 없이 동적 라이브러리만 다시 컴파일하여 재배포 하면 됨
어떤 *.dll의 어떤 함수를 호출하겠다는 정보를 포함 시키고 프로그램 실행 시 해당 함수들을 초기화한 후 이용하는 방식
- 실행파일에 어떤 함수를 사용하겠다는 정보를 포함하기 위해서는 *.lib파일이 필요함
- 이때 .lib파일은 정적 라이브러리가 아니라 암시적 링킹을 위해 필요한 심볼이 들어있는 .lib파일로 동적 링킹 과정에 꼭 필요함
- 특징
- 프로그램을 시작하면서 해당 .dll을 로드하며 .dll 에 정의된 함수를 마치 자신의 함수처럼 호출할 수 있음
- 프로그램이 실행될 때 *.dll 파일이 로드되므로 실행 시 연결이라고 표현함
- 장점 : 코드가 간결하여 사용하기 쉬움
프로그램이 실행 중일 때 *.dll 파일이 있는지 검사하고 동적으로 원하는 함수만 호출하는 방법
호출할 함수의 포인트를 얻어 함수를 호출
- 특징
- 링킹과정에서 .dll의 함수 정보가 필요하지 않기 때문에 .lib파일이 필요없음
- 사용하지 않는 함수들까지 전부 다 프로그램에 포함할 필요가 없어 자원을 아낄 수 있음
- 프로그램이 실행 중에 *.dll 파일이 메모리에 읽히므로 실행 중 연결이라고 표현함
라이브러리를 링크하는 방법에 따라 정적 링킹(Static Linking)과 동적 링킹(Dynamic Linking)으로 나눔
각 오브젝트 파일에 있는 심볼 참조를 어떤 심볼정의에 연관시킬지 결정하는 과정
여러 개의 오브젝트 파일에 같은 이름의 함수 또는 변수가 정의되어 있을 때 어떤 파일의 어떤 함수를 사용할지 결정
오브젝트 파일에 있는 데이터의 주소나 코드의 메모리 참조 주소를 알맞게 배치하는 과정
각 오브젝트 파일에 있는 데이터의 주소나 코드의 메모리 참조 주소가 링커에 의해 합쳐진 실행 파일에서의 주소와 다르기 때문에 그것을 알맞게 수정해야함
오브젝트 파일 포맷의 재배치 정보 섹션에서 링커에게 오브젝트 파일을 만들때 어떻게 재배치 해야하는지 방법을 알려줌
여러 개의 오브젝트 파일들을 하나의 실행 파일로 묶을 때 필요한 정보를 효율적으로 파악할 수 있는 구조