산타는 없다

정적 라이브러리(Static Library) 와 정적 링킹(Static Linking) 본문

Computer Science/운영체제

정적 라이브러리(Static Library) 와 정적 링킹(Static Linking)

LEDPEAR 2021. 5. 17. 16:18
반응형

정적 라이브러리는 컴파일타임에 링킹되는 라이브러리입니다.

정적 라이브러리가 링킹되는 것을 정적 링킹(Static Linking)이라고 합니다.

정적 링킹은 실행파일을 만들 때 프로그램에서 사용하는 모든 라이브러리 모듈을 복사하는 방식을 말하며 링커에 의해 이루어집니다. 즉, 자신이 작성한 프로그램에서 A라는 외부 함수를 사용했다면, A라는 외부 함수에 대한 정보를 자신이 작성한 프로그램의 실행파일을 만들 때 복사해 옵니다.

이렇게 모든 라이브러리 모듈을 복사하기 때문에 실행시 별도의 라이브러리 파일이 필요하지 않습니다. 하지만 실행 파일 내에 라이브러리 코드가 저장되기 때문에 프로그램 크기가 커지고 메모리 효율이 좋지 않습니다.

여기서 메모리 효율이 좋지 않다는 것은 각각의 프로세스에서 라이브러리가 할당이 되어 메모리공간을 차지하게 되지만 동적 라이브러리는 해당 라이브러리가 이미 메모리에 있다면 추가로 할당하지 않고 메모리에 있는 내용을 사용하기 때문에 상대적으로 효율이 좋지 않다는 것을 뜻합니다.

반대로 실행에 있어서는 저장된 외부 공간까지 접근해야하는 동적 라이브러리와 다르게 내부 공간에 저장되어 있기 때문에 빠르고 별도의 파일이 필요하지 않습니다.

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


정적 라이브러리의 메모리 공간

정적 라이브러리의 코드는 실행 파일에 포함되기 때문에 프로세스가 생성될 때 메모리에 할당됩니다.
이때, 정적 라이브러리의 코드는 실행파일의 코드와 같이 Code 영역에 할당됩니다.

정적 라이브러리의 내용이 수행될 때는 일단 함수가 수행될 때와 마찬가지로 Stack 영역에 지역변수를 할당하면서 수행됩니다.

 

반응형
Comments