Encryption

Static Library와 Dynamic Library

yeonx 2023. 10. 6. 10:25
728x90

라이브러리에 의존하는 프로그램은 시스템에 필요한 라이브러리가 설치되지 않으면 동작하지 않는다.

 

실제로 실행될 때는 라이브러리가 제공하는 코드와 링크되어야 프로그램 코드가 동작할 수 있다. 라이브러리는 오브젝트 코드와 결합하는 방법에 따라 정적(staitc) 라이브러리와 공유(shared) 라이브러리로 나뉜다. 공유(shared) 라이브러리는 다시 일반적인 동적 링크(Dynamic link) 라이브러리와 동적 로드(Dynamic load) 라이브러리로 나뉜다.

 

정적 라이브러리(Static Library)란?

개념
- 컴파일 단계에서 외부 함수나 루틴을 링크하는 방법

장점
- 컴파일 단계에서 코드가 링크되기 때문에, 런타임에서 빠르게 작동

단점
- 코드 자체가 프로그램 내부에 들어가게 되는데, 이 때문에 프로그램의 용량이 커진다.

프로그램 빌드 시에 라이브러리가 제공하는 코드를 실행 파일에 넣는 방식의 라이브러리를 의미한다.

 

이 방식의 장점은 시스템 환경이 변해도 애플리케이션에 아무런 영향이 없고, 완성된 애플리케이션을 안정적으로 사용할 수 있다는 점이 있다.

반면에 사용하는 모든 오브젝트 코드를 실행 파일에 내장하기 때문에 메모리에 로드되는 애플리케이션 코드 크기가 커진다는 단점이 있다.

 

유닉스/리눅스에서는 확장자로 .a가 붙는다. 윈도우에서는 .lib가 붙는다.

 

 

공유 라이브러리(Shared Library)란?

개념
- 런타임에서 다이나믹 링크하는 방법
- 함수나 루틴이 사용될 때마다 해당 기능을 외부 라이브러리에 참조하여 사용하는 방식

장점
- 코드 자체가 프로그램 내부에 들어가지 않기 때문에 프로그램의 용량은 작게 유지할 수 있음

단점
- 외부라이브러리를 사용하기 위해서 라이브러리 파일을 항상 가지고 다녀야 함
- 함수나 루틴을 사용할 때마다 외부 라이브러리를 참조해야 하기 때문에 런타임에 cost가 생겨남

어떤 라이브러리가 제공하는 기능을 다른 애플리케이션에서 사용하고 싶을 때, 라이브러리 코드를 메모리에 하나만 두고 각 애플리케이션에서 이를 공유하는 방식의 라이브러리를 의미한다.

 

공유 라이브러리는 프로그램 실행 시 라이브러리의 코드와 애플리케이션의 코드가 메모리에 로드되는 시점에 링크된다. 그렇기 때문에 라이브러리를 이용하는 애플리케이션에는 호출할 라이브러리 함수의 정보만 들어 있다. 애플리케이션이 실행되어 메모리에 로드된 시점에서야 그 함수가 메모리의 어디에 있는지 알 수 있고, 그 곳으로 포인터가 쓰여지면서 함수의 호출을 실현한다.

 

이 구조를 이용하면 한 라이브러리의 코드를 여러 애플리케이션에서 공유할 수 있기 때문에 메모리를 효율적으로 이용할 수 있다.

윈도우에서는 확장자로 .dll이 붙고, 리눅스에서는 확장자로 .so가 붙는다.

 

 

 

참고 : https://m.blog.naver.com/kr_dukie27/10175747579 https://www.cv-learn.com/20220120-static-vs-shared-libs/