정적 링킹 vs 동적 링킹: 차이점 설명
링킹은 컴파일된 코드를 그 코드가 사용하는 라이브러리 코드와 결합하는 과정입니다. 정적 링킹에서는 필요한 라이브러리 코드가 빌드 시점에 실행 파일에 복사되므로 프로그램이 독립적으로 동작합니다. 동적 링킹에서는 실행 파일이 필요한 공유 라이브러리만 기록해 두고, 운영체제가 프로그램 시작 시 이를 로드하므로 여러 프로그램이 하나의 사본을 공유할 수 있습니다. 정적 링킹은 배포가 더 간단하고, 동적 링킹은 메모리를 절약하며 업데이트가 쉽습니다.
| 비교 항목 | 정적 링킹 | 동적 링킹 |
|---|---|---|
| 수행 시점 | 빌드 시점: 라이브러리 코드가 실행 파일에 복사됨 | 로드 시점 또는 실행 시점: 동적 링커가 공유 라이브러리(.so, .dll)를 찾아 매핑함 |
| 실행 파일 크기 | 큼 | 작음 |
| 메모리 사용 | 각 프로그램이 라이브러리 코드 사본을 따로 가짐 | 공유 라이브러리 하나를 여러 프로세스가 공유할 수 있음 |
| 업데이트와 보안 패치 | 프로그램을 다시 빌드하고 재배포해야 함 | 라이브러리를 한 번만 업데이트하면 재빌드 없이 모든 프로그램이 혜택을 봄(인터페이스가 호환되는 경우) |
| 시작 시간 | 약간 빠름 | 약간 느림: 심볼을 해석해야 함(대개 지연 방식) |
| 배포 | 독립적: 라이브러리가 설치되어 있지 않아도 실행됨 | 대상 시스템에 올바른 버전의 라이브러리가 필요하며, 없으면 프로그램이 시작되지 않음 |
| 실행 시간 비용 | 프로그램 전체 최적화와 직접 호출 가능 | GOT와 PLT를 거치는 간접 호출로 인한 작은 오버헤드 |
| 버전 문제 | 실행 시점에는 없음 | 프로그램과 설치된 라이브러리 간 불일치 가능 |
| 주요 용도 | 임베디드 펌웨어, 단일 파일 도구, 최소 컨테이너 | 범용 운영체제의 대부분의 프로그램, 플러그인, libc 같은 시스템 라이브러리 |
수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.