라이브러리
라이브러리와 정적 및 동적 라이브러리의 차이를 실습을 통해 학습한다.
그림으로 배우는 리눅스 구조 정리한 내용
라이브러리
라이브러리는 여러 프로그램에서 공통으로 사용하는 함수와 데이터를 모아둔 것이다. 이를 통해 개발자는 효율적으로 프로그램을 작성할 수 있다. 특히, 운영체제(OS)는 기본적인 시스템 기능을 제공하는 라이브러리를 제공한다.
표준 C 라이브러리(glibc)
운영체제가 제공하는 대표적인 라이브러리로, C언어 표준 라이브러리인 glibc(GNU C Library)가 있다. 이를 통해 대부분의 C프로그램이 표준 함수와 시스템 콜을 사용할 수 있다.
예시: ldd 명령어를 통해 사용하는 라이브러리를 확인
# ldd /bin/echo
# ldd /bin/cat
# ldd /usr/bin/python3
Python
복사
•
libc.so.6: 표준 C라이브러리
예시: 시스템에 존재하는 다양한 프로그램 라이브러리 확인
# dpkg-query -W | grep ^lib
Python
복사
정적 vs 동적 라이브러리
라이브러리는 정적과 동적(공유) 두 가지로 나뉜다. 모두 같은 기능을 제공하지만 프로그램과 결합하는 방식이 다르다.
구분 | 정적 라이브러리 Static Library | 동적 라이브러리 Dynamic Library |
링크 방식 | 함수가 프로그램에 포함됨 | 프로그램 실행 시 라이브러리를 로드 |
파일 크기 | 실행 파일 크기 증가 | 실행 파일 크기 작음 |
라이브러리 수정 | 모든 실행 파일 재컴파일 필요 | 라이브러리 교체로 모든 프로그램 업데이트 가능 |
공유 자원 | 각각 독립적으로 코드 사용 | 메모리와 코드 공유 가능 |
예시: 정적 라이브러리
# cc -static -o pause pause.c
# ls -l pause
-rwxr-xr-x 1 root root 608288 Dec 20 05:38 pause
# ldd pause
not a dynamic executable
Shell
복사
•
파일 크기: 약 600KB
•
동적 라이브러리 링크 없음.
예시: 동적 라이브러리
# cc -o pause pause.c
# ls -l pause
-rwxr-xr-x 1 root root 9208 Dec 20 05:41 pause
# ldd pause
linux-vdso.so.1 (0x0000ffff8b239000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffff8b084000)
Shell
복사
•
파일 크기: 약 9KB
•
libc.so.6 동적 링크.
동적 라이브러리 장점
•
시스템에서 차지하는 크기를 줄일 수 있다.
•
라이브러리에 문제가 있을 때 공유 라이브러리를 수정 버전으로 교체하면 되므로 유지보수가 용이하다.
정적 라이브러리 선호 추세
최근 언어(예: Go)는 정적 링크를 다시 선호하는 추세다.
•
단일 파일 실행: 환경에 관계없이 프로그램 실행 가능
•
빠른 시작 시간: 실행 시 추가 로드 작업 필요 없음
•
DLL 지옥 문제 방지: 라이브러리 버전 충돌을 피할 수 있음
마무리
•
라이브러리:
프로그램 개발 시 공통적으로 사용하는 기능을 제공하는 재사용 가능한 코드 집합
•
표준 C 라이브러리(glibc):
C언어 프로그램에서 사용되는 표준 함수와 시스템 콜 래퍼를 제공하는 GNU 프로젝트의 라이브러리
•
시스템 콜 래퍼:
고급 언어에서 시스템 콜을 쉽게 호출할 수 있도록 제공되는 함수로, 아키텍처 의존성을 추상화
•
정적 라이브러리:
프로그램 빌드 시 라이브러리 코드를 실행 파일에 포함시키는 방식으로 독립적으로 동작
•
동적 라이브러리:
프로그램 실행 중에 메모리에 로드되어 모든 프로그램에서 공유되는 방식의 라이브러리
Q&A
Q. 정적 라이브러리와 공유 라이브러리의 차이점은 무엇인가요?
Q. 시스템 콜 래퍼 함수와 공유 라이브러리는 어떤 관계가 있나요?
Q. 정적 링크와 동적 링크의 실제 사용 사례는 무엇인가요?
Q.DLL 지옥이란 무엇인가요?
Related Posts
Search