정적 라이브러리와 동적 라이브러리 :: YJcode

오프젝트 라이브러리는 컴파일된 오브젝트 코드를 담고 있는 파일로, 응용 프로그램이 호출할 수 있는 함수들이 들어 있다. 연관된 함수들을 하나의 오브젝트 라이브러리에 담으면 프로그램 생성과 유지보수가 편리해진다. 현대 유닉스 시스템은 정적 라이브러리와 동적 라이브러리라는 두 가지 오브젝트 라이브러리를 제공한다.

 

 

  • 정적 라이브러리

초기 유닉스 세스템에서는 정적 라이브러리밖에 존재하지 않았다. 정적 라이브러리는 쉽게 말하면, 컴파일된 오브젝트 모듈의 체계적인 묶음이다. 정적 라이브러리의 함수를 쓰기 위해서는, 프로그램을 빌드하는 과정 중 링크 과정에서 해당 정적 라이브러리를 명시함으로써 해당 라이브러리에 포함되어 있는 여러 함수를 프로그램 내 코드에 필요한 정의를 복사해서 넣는다. 이러한 프로그램을 정적으로 링크된 프로그램이라고 한다.

정적 라이브러리를 사용할 경우 해당 라이브러리를 사용하는 여러 프로그램이 중복되는 코드가 여기저기 산재해 있어 커널에 설치되는 프로그램의 수가 많아질 수록, 혹은 여러 프로그램을 동시에 멀티 태스킹을 해야 할 경우, 각각의 프로그램이 필요 이상으로 덩치가 커지는 문제가 있다. 다시 한번 정리해서 말하자면, 정적으로 링크된 각 프로그램들은 라이브러리에서 추출된 오브젝트 모듈들의 복사본을 각각 포함하고 있기 때문에, 오브젝트 코드가 중복되어 디스크 공간이 낭비되고, 같은 라이브러리 함수를 쓰는 프로그램들이 동시에 실행될 때 또한 메모리가 낭비된다는 단점이 있다.

또한 정적 라이브러리는 라이브러리 함수를 수정해야 하는 상황이 발생하였을 경우, 정적 라이브러리만 수정하는 것으로 끝나는 것이 아니라 이미 이러한 라이브러리를 사용한 모든 프로그램들을 찾아내서 새로이 링크 작업을 거쳐 실행 파일을 생성하여야 한다는 치명적인 단점이 있으나, 한번 실행파일을 생성하면, 정적 라이브러리가 추후 제거되더라도 이미 생성된 실행파일을 실행하는 데는 아무런 문제가 없다는 장점으로 인해 많은 단점에도 불구하고 아직까지 사용되고 있다.

 

  • 동적 라이브러리

동적 라이브러리는 다른 말로 공유 라이브러리라고도 불리우며 정적 라이브러리의 문제를 해결하기 위해 만들어졌다.

프로그램이 동적 라이브러리와 링크되면, 라이브러리 오브젝트 모듈을 실행 파일로 복사하는 대신, 링커는 실행 실행 파일이 실행 시에 해당 공유 라이브러리가 필요하다는 정보만 기록하여 둔다. 이후 실행 파일이 실제로 실행되어 메모리에 올라가면, 동적 라이브러리에 속한 함수가 필요할 때 라이브러리 정보를 참조하여 실제 동적 라이브러리를 참조하여 필요한 정보를 메모리에 올리게 된다. 이후 다른 프로그램이 실행되며 같은 라이브러리 함수를 참조하고자 하면, 이미 메모리에 존재하는 동적 라이브러리 정보를 참조하여 바로 링크 작업을 하게 된다. 이러한 특성 때문에 공유 라이브러리라고도 불리고 있다. 또한 동적 라이브러리는 수정이 필요할 경우 라이브러리만을 수정하여도 기존의 프로그램들이 수정된 라이브러리를 사용한다는 점에서 유지보수가 매우 쉬운 편에 속한다. 하지만, 그럼에도 불구하고, 수정이 잘못되거나, 삭제될 경우 이 라이브러리를 사용하는 프로그램 또한 오작동, 혹은 실행이 불가능해진다는 단점이 있어서 무조건 정적 라이브러리보다 좋은 것은 아니다.

 

 

커널은 위 두 라이브러리의 장단점을 각 라이브러리 성격에 대비하여, 적절한 방식을 사용하여 라이브러리를 구성하고 있다.

+ Recent posts