라이브러리에 의존하는 프로그램은 시스템에 필요한 라이브러리가 설치되지 않으면 동작하지 않는다.
실제로 실행될 때는 라이브러리가 제공하는 코드와 링크되어야 프로그램 코드가 동작할 수 있다. 라이브러리는 오브젝트 코드와 결합하는 방법에 따라 정적(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/
'Encryption' 카테고리의 다른 글
[Linux] LD_LIBRARY_PATH (1) | 2023.10.06 |
---|---|
[GCC] Static/Shared Library 생성 및 사용 (1) | 2023.10.06 |
[OpenSSL] File 암호화 및 복호화 (대칭키/encryption password) (0) | 2023.10.05 |
Hash와 Salt (1) | 2023.10.05 |
해쉬 알고리즘(Hash Algorithm) (1) | 2023.10.05 |