Program Language/C & C++

[C++] Implicit Linking/Explicit Linking 장단점

야곰야곰+책벌레 2021. 4. 9. 15:50
728x90
반응형

1. Implicit Linking (묵시적 링크)

Implicit Linking은 정확하게 표현하면 Implicit Load Time Linking 이라 할 수 있는데 이는 해당 프로그램에서 사용될 DLL 정보를 프로그램에 내장하는 방법이다.

이렇게 하면 프로그램을 실행할 때 어떤 DLL이 필요한지 알려주어 프로그램이 착오 없이 실행된다.

Implicit Linking으로 사용하고자 할 때는 해당 LIB 파일을 링크 옵션에 더해준 뒤 헤더 파일을 소스코드에 포함시키고 원하는 함수를 사용하면 되므로 간단하다.

2. Explicit Linking (명시적 링크)

Explicit Linking은 Implicit Linking에 비해 그 사용이 까다롭지만 원하는 시점에 마음대로 올리고 내릴 수 있다는 점에서 관리가 유리하다.

Explicit Linking은 LoadLibrary나 LoadLibraryEx에 의해 처리되며, 호출함과 동시에 DLL을 찾은 후 해당 DLL을 프로세스 메모리에 맵핑하여 실행을 위한 준비를 한다.

이렇게 프로세스의 가상 메모리에 적재된 DLL은 사용이 끝나면 FreeLibrary를 사용하여 풀어주게 된다.

DLL이 적재될 때, 그리고 해제될 때 카운터의 값이 바뀌게 되고 이 카운터가 0이 되면 해당 DLL은 더 이상 사용되지 않으므로 시스템은 자동으로 메모리에서 삭제한다.

Explicit Linking으로 DLL을 사용하고자 할 때는 몇 가지 과정이 더 포함되어야 한다.

2.1 Explicit Linking의 필요성

  • Application은 자신이 Run-time까지 Load 하는 DLL의 이름을 알지 못합니다.
    예를 들어 애플리케이션은 시작할 때 구성 파일에서 DLL의 이름과 내보낸 함수를 가져올 수 있습니다.
  • 프로세스 시작 시 DLL을 찾을 수 없으면 운영체제에서 Implicit Linking을 사용하는 프로세스를 종료합니다.
    명시적 연결을 사용하는 프로세스는 이 상황에서 종료되지 않으며 오류로부터 복구를 시도할 수 있습니다.
    예를 들어 프로세스에서 사용자에게 오류를 알리고 사용자가 DLL에 대한 다른 경로를 지정하게 할 수 있습니다.
  • Application이 Load 될 때 모든 DLL을 Load 하기 때문에 많은 DLL에 Implicit Linking은 속도를 저하시킬 수 있습니다.
    Application은 필요한 경우에만 다른 DLL을 Load하는 Explicit Linking을 사용할 수 있습니다.
  • Explicit Linking을 사용하면 Liabrary 가져오기를 사용하여 Application을 연결할 필요가 없습니다.
    DLL 변경으로 인해 내보내기가 변경되는 경우에도 Application은 다시 연결할 필요가 없습니다.
    Implicit Linking을 사용하는 Application은 여전히 변경된 Library 가져오기를 다시 실행해야 합니다.

2.2 Explicit Linking의 위험성

  • DLL에 DllMain 진입점 함수가 있는 경우 운영체제는 LoadLibrary를 호출한 Thread의 Context에서 이 함수를 호출합니다.
    LoadLibrary(or AfxLoadLibrary)를 호출할 때 이미 존재하는 모든 Thread가 초기화되지 않기 때문에 DLL이 DllMain 함수를 사용하여 프로세스의 각 Thread를 초기화 하는 경우 Explicit Linking으로 인한 문제가 발생할 수 있습니다.
  • DLL이 정적 범위 데이터를 __declspec(thread)으로 선언하는 경우 Explicit Linking의 경우 보호 오류(Access Violation Exception)가 발생할 수 있습니다.
    따라서 DLL을 만들 때 Thread Local Storage를 사용해서는 안됩니다.
    피할 수 없는 경우 DLL을 동적으로 로드할 때 발생할 수 있는 문제에 대해서 사용자에게 알립니다.
728x90
반응형