기술나눔

링커 작동 방식, 정적 링크와 동적 링크의 차이점, 동적 링크 라이브러리 생성 및 사용 방법

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

링커는 프로그램 개발에서 중요한 역할을 하며 여러 개체 파일과 라이브러리 파일을 실행 파일로 통합합니다. 링커의 작동 방식, 정적 링크와 동적 링크의 차이점, 동적 링크 라이브러리를 만들고 사용하는 방법을 살펴보기 전에 먼저 링커의 기본 기능에 대해 간략히 설명하겠습니다.

링커 작동 방식

링커 하나 이상의 개체 파일과 라이브러리 파일을 실행 파일로 결합하는 역할을 하는 도구입니다. 주요 기능은 다음과 같습니다:

  1. 기호 분석 : 프로그램의 모든 기호(함수 및 변수 이름)를 식별하고 처리하여 각 기호가 고유한 정의를 갖도록 합니다. 참조되지만 정의되지 않은 기호(외부 기호)의 경우 링커는 제공된 라이브러리 또는 기타 개체 파일에서 정의를 찾습니다.

  2. 초기화 : 각 모듈의 코드와 데이터 주소를 최종 메모리 주소로 조정합니다. 재배치에는 코드의 주소 수정과 데이터 세그먼트의 위치 조정이 포함되어 모든 참조가 올바른 메모리 위치를 가리키도록 합니다.

  3. 세그먼트 병합: 서로 다른 대상 파일의 동일한 유형의 세그먼트(예: 코드 세그먼트, 데이터 세그먼트 등)를 하나의 연속 세그먼트로 병합합니다.

  4. 처리 라이브러리 : 프로그램에 필요한 라이브러리 코드를 목적 파일과 연결합니다. 링커는 정적 라이브러리와 동적 라이브러리라는 두 가지 유형의 라이브러리를 처리할 수 있습니다.

  5. 실행 파일 생성: 최종 출력은 운영 체제에서 실행할 수 있는 실행 파일입니다.

정적 연결과 동적 연결의 차이점

정적 연결 그리고동적 연결 이는 링커의 두 가지 작업 모드로, 각각 특성과 사용 시나리오가 다릅니다.

정적 링크
  • 개념 : 정적 링크에서는 라이브러리 코드가 컴파일 타임에 복사되어 이를 사용하는 모든 실행 파일에 포함됩니다. 이러한 방식으로 생성된 실행 파일에는 필요한 모든 코드가 포함되어 있으며 외부 라이브러리 파일에 의존하지 않습니다.

  • 이점

    • 강력한 독립성: 생성된 실행 파일에는 모든 종속성이 포함되어 있으며 런타임 시 추가 라이브러리 파일이 필요하지 않습니다.
    • 우수한 호환성: 런타임은 시스템에 설치된 라이브러리 버전에 의존하지 않으며 "라이브러리 버전 충돌" 문제가 발생하지 않습니다.
  • 결점

    • 큰 파일 크기: 각 실행 파일에는 전체 라이브러리 코드가 포함되어 있으므로 파일 크기가 늘어납니다.
    • 업데이트 문제: 라이브러리가 업데이트되면 해당 라이브러리를 사용하는 모든 프로그램을 다시 컴파일해야 합니다.
  • 정적 라이브러리 확장

    • 윈도우: .lib
    • 유닉스/리눅스: .a
동적 링크
  • 개념 : 동적 링크에서는 라이브러리 코드가 런타임에 로드되고 실행 파일에 포함되지 않습니다. 실행 파일에는 라이브러리에 대한 참조만 포함되어 있으며 라이브러리 코드는 런타임 시 운영 체제에 의해 로드됩니다.

  • 이점

    • 작은 파일 크기: 실행 파일에는 라이브러리 코드가 포함되지 않고 라이브러리에 대한 참조만 포함됩니다.
    • 업데이트 용이성: 라이브러리 업데이트 시 프로그램을 다시 컴파일할 필요 없이 라이브러리 파일만 교체하면 됩니다.
    • 높은 메모리 효율성: 여러 프로그램이 동일한 라이브러리 파일의 메모리 인스턴스를 공유하여 메모리 사용량을 줄일 수 있습니다.
  • 결점

    • 강력한 종속성: 실행 파일은 실행 시 올바른 버전의 라이브러리 파일을 찾아 로드할 수 있어야 합니다.
    • 호환성 문제: 라이브러리 파일 버전이 일치하지 않으면 프로그램이 실패할 수 있습니다.
  • 동적 라이브러리 확장

    • 윈도우: .dll(동적 링크 라이브러리)
    • 유닉스/리눅스: .so(공유 객체)

동적 링크 라이브러리 생성 및 사용

동적 링크 라이브러리 생성

다른 운영 체제에서는 동적 링크 라이브러리를 만드는 방법이 약간 다릅니다. 다음은 몇 가지 일반적인 단계와 명령입니다.

Linux에서 동적 링크 라이브러리 만들기
  1. 라이브러리 코드 작성

    동적 라이브러리에 배치하려는 함수가 포함된 C 소스 파일을 만듭니다.

    // example.cpp
    #include