정의
동적 링커(동적 로더)는 실행 파일이 시작될 때 또는 실행 중에 공유 라이브러리(동적 라이브러리)를 메모리에 적재하고, 해당 라이브러리 내 함수와 변수에 대한 주소를 연결해 주는 시스템 소프트웨어 구성 요소이다. 이를 통해 프로그램은 컴파일 시점에 모든 코드를 포함하지 않고도 필요한 기능을 외부 모듈에서 동적으로 호출할 수 있다.
동작 원리
-
로드 타임 바인딩
- 실행 파일이 시작될 때 운영체제 커널이나 런타임 환경이 동적 링커를 호출한다.
- ELF(Unix 계열) · PE(Windows) · Mach-O(macOS) 등 실행 파일 포맷에 기록된 의존 라이브러리 목록을 읽어, 해당 라이브러리를 찾아 메모리에 매핑한다.
-
심볼 해석
- 실행 파일과 라이브러리 모두에 존재하는 심볼 테이블을 기반으로, 함수·전역 변수 등 외부 심볼의 실제 메모리 주소를 결정한다.
- 동일한 심볼이 여러 라이브러에 존재할 경우, 검색 순서(예:
LD_LIBRARY_PATH, 시스템 디폴트 경로 등)에 따라 가장 먼저 발견된 정의가 사용된다.
-
재배치(Relocation)
- 코드와 데이터 영역에 포함된 주소값이 아직 확정되지 않은 경우, 재배치 정보를 이용해 런타임에 올바른 주소로 수정한다.
-
지연 바인딩(Lazy Binding) (선택적)
- 처음 호출되는 시점에만 해당 심볼을 해석한다. 이를 통해 시작 시간을 단축하고, 사용되지 않은 심볼에 대한 오버헤드를 감소시킨다.
주요 운영체제 구현 예시
| 운영체제 | 실행 파일 포맷 | 동적 링커 이름(예) | 주요 특징 |
|---|---|---|---|
| Linux | ELF | ld.so (glibc) / ld-linux.so.* |
LD_PRELOAD, LD_LIBRARY_PATH 등 환경 변수 제공 |
| Windows | PE | ntdll.dll 내부 Ldr* 계열 함수 |
DLL 검색 순서와 매니페스트 기반 버전 관리 |
| macOS | Mach-O | dyld (Dynamic Loader) |
DYLD_LIBRARY_PATH, @rpath 등 런타임 경로 지정 |
| Android | ELF (Bionic) | linker / linker64 |
SELinux 정책에 따라 라이브러리 접근 제한 |
관련 용어
- 정적 링커: 프로그램 전체를 하나의 실행 파일에 포함시키는 과정(컴파일 시점)에서 사용되는 링커.
- 공유 라이브러리(동적 라이브러리): 실행 파일과 별도로 배포되며, 런타임에 동적 링커에 의해 로드되는 파일(
.so,.dll,.dylib). - 재배치(Relocation): 메모리 주소가 코드에 하드코딩되지 않도록, 실행 시점에 주소를 수정하는 과정.
- 심볼(Symbol): 함수·전역 변수 등 외부에서 참조 가능한 이름과 해당 메모리 위치를 매핑한 정보.
참고
- 명세: System V Application Binary Interface (ABI) – ELF
- 마이크로소프트: Dynamic-Link Library (DLL) Overview
- 애플: Mach-O Runtime Architecture
동적 링커는 현대 운영체제에서 애플리케이션의 메모리 사용 효율을 높이고, 라이브러리의 업데이트 및 재사용을 용이하게 만드는 핵심 메커니즘으로 널리 활용된다.