본문 바로가기

IT/기타

동적 연결 라이브러리(Dynamic Link Library, DLL)

반응형

동적 연결 라이브러리(Dynamic Link Library, DLL)는 프로그램이 실행되는 동안 필요한 코드와 데이터를 동적으로 로드하여 사용할 수 있도록 지원하는 라이브러리입니다. 주로 Windows 운영체제에서 사용되며, 프로그램이 실행될 때 필요한 시점에만 라이브러리를 메모리에 로드하여 시스템 리소스를 효율적으로 관리할 수 있습니다.

동적 연결 라이브러리의 특징


1. 코드 재사용성

  • 여러 프로그램이 동일한 DLL을 공유하여 사용할 수 있습니다.
  • 중복 코드가 줄어들어 개발 생산성이 향상됩니다.

2. 메모리 효율성

  • 필요할 때만 메모리에 로드되므로 메모리 사용량이 줄어듭니다.
  • 여러 프로세스가 동일한 DLL을 공유할 수 있습니다.

3. 유지보수 용이성

  • 프로그램을 다시 컴파일하거나 배포하지 않고 DLL만 교체하여 기능을 업데이트할 수 있습니다.
  • 애플리케이션의 유지보수가 용이해집니다.

4. 확장성

  • 실행 중에도 새로운 기능을 추가할 수 있습니다.
  • 플러그인 아키텍처(Plugin Architecture) 개발에 유리합니다.

정적 라이브러리와 동적 라이브러리의 비교

구분 정적 라이브러리(Static Library) 동적 라이브러리(Dynamic Library)
확장자 .lib(Windows), .a(Linux)  .dll(Windows), .so(Linux)
링크 시점 컴파일 시점 실행 시점
메모리 사용 독립적으로 메모리에 로드 공유 메모리에 로드 가능
배포 프로그램 내에 포함됨 별도로 배포
성능 상대적으로 빠름 약간의 오버헤드 발생
유연성 낮음 높음

동적 연결 라이브러리 사용 예제 (C/C++)

DLL 생성 (Windows 환경)

// mylibrary.c
#include <windows.h>

__declspec(dllexport) int add(int a, int b) {
    return a + b;
}

컴파일 명령어(Windows 환경, gcc 기준)

gcc -shared -o mylibrary.dll mylibrary.c

DLL 사용 (Windows 환경)

// main.c
#include <stdio.h>
#include <windows.h>

int main() {
    HINSTANCE hLib = LoadLibrary("mylibrary.dll");
    if (hLib == NULL) {
        printf("DLL 로딩 실패\n");
        return 1;
    }

    typedef int (*AddFunc)(int, int);
    AddFunc add = (AddFunc)GetProcAddress(hLib, "add");
    if (add == NULL) {
        printf("함수 로딩 실패\n");
        FreeLibrary(hLib);
        return 1;
    }

    int result = add(3, 5);
    printf("3 + 5 = %d\n", result);

    FreeLibrary(hLib);
    return 0;
}

컴파일 및 실행

gcc -o main.exe main.c
main.exe

출력 결과:

3 + 5 = 8

DLL 사용 시 주의사항

  • 호환성 관리 : 라이브러리의 변경 시 인터페이스(함수 시그니처)가 유지되어야 합니다.
  • 메모리 관리 : DLL에서 할당한 메모리는 반드시 DLL 내부 함수로 해제해야 합니다.
  • 보안 이슈 : 악성 DLL이 시스템에 로드되는 DLL 인젝션(DLL Injection) 공격에 대비해야 합니다.
  • 의존성 관리 : 필요한 DLL이 실행 시점에 올바르게 로드될 수 있도록 관리해야 합니다.

동적 연결 라이브러리는 효율성과 확장성을 극대화할 수 있는 강력한 도구이지만, 그만큼 메모리 관리와 보안에 신경 써야 합니다.

반응형