WIPIVERSE

동적 링커

정의
동적 링커(동적 로더)는 실행 파일이 시작될 때 또는 실행 중에 공유 라이브러리(동적 라이브러리)를 메모리에 적재하고, 해당 라이브러리 내 함수와 변수에 대한 주소를 연결해 주는 시스템 소프트웨어 구성 요소이다. 이를 통해 프로그램은 컴파일 시점에 모든 코드를 포함하지 않고도 필요한 기능을 외부 모듈에서 동적으로 호출할 수 있다.

동작 원리

  1. 로드 타임 바인딩

    • 실행 파일이 시작될 때 운영체제 커널이나 런타임 환경이 동적 링커를 호출한다.
    • ELF(Unix 계열) · PE(Windows) · Mach-O(macOS) 등 실행 파일 포맷에 기록된 의존 라이브러리 목록을 읽어, 해당 라이브러리를 찾아 메모리에 매핑한다.
  2. 심볼 해석

    • 실행 파일과 라이브러리 모두에 존재하는 심볼 테이블을 기반으로, 함수·전역 변수 등 외부 심볼의 실제 메모리 주소를 결정한다.
    • 동일한 심볼이 여러 라이브러에 존재할 경우, 검색 순서(예: LD_LIBRARY_PATH, 시스템 디폴트 경로 등)에 따라 가장 먼저 발견된 정의가 사용된다.
  3. 재배치(Relocation)

    • 코드와 데이터 영역에 포함된 주소값이 아직 확정되지 않은 경우, 재배치 정보를 이용해 런타임에 올바른 주소로 수정한다.
  4. 지연 바인딩(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

동적 링커는 현대 운영체제에서 애플리케이션의 메모리 사용 효율을 높이고, 라이브러리의 업데이트 및 재사용을 용이하게 만드는 핵심 메커니즘으로 널리 활용된다.

둘러보기

더 찾아볼 만한 주제

    전체 문서 보기