티스토리 뷰

개발

DLL

소심야채 2023. 9. 3. 19:44

DLL파일은 '실행파일'의 일종으로 취급된다.

- dll은 exe, sys 파일들과 더불어 PE 파일의 한 종류로 구분된다.

- 로더에 의해서 메모리로 로딩된후 실행 될 수 있는 파일

- 라이브러리의 내용이 독립적으로 메모리에 상주

 

DLL의 내용은 해당 DLL을 로딩하는 프로세스의 주소공간에 맵핑된다.

- static 라이브러리는 이미 binary화된 코드들의 집합으로 컴파일시 그를 링크하는 프로그램에 편입되어 컴파일이 이루어진다.

- dynamic link libaray -> 라이브러리의 내용은 편입 되지않고 extern symbol에 대한 linking만이 이루어짐

- DLL은 메모리에 상주하기에 여러 프로세스에 로드될지어도 DLL의 내용은 메모리 한 군데에만 존재

 

DLL의 두가지 링킹방식

- 암시적 링킹 (Implicit linking)

  - 프로그램 링크시 "어떤 dll을 링킹하겠어"라는 직접적인 명령어를 지정하는 방식

  - 컴파일되는 코드 어디가에 #pragma comment(lib, "[dll의 이름].lib")라는 매크로 작성.

  - 프로젝트 속성에 additional library 추가하기

  - 직접 link.exe를 이용하는 경우 obj들과 더불어 해당 dll의 lib을 포함시키는 방식

 

- 명시적 링킹 (Explicit linking)

  - 코드상에서 시스템함수로 런타임상 DLL을 링킹을 지정하는 방식

  - DLL을 링킹을 지정하는 LoadLibrary함수와 DLL의 export 함수포인터를 얻어오는 GetProcAdress함수가 쓰인다.

  - GetProcAdress함수는 void*형 주소를 리턴하기 때문에 본래의 함수 포인터로 형변환하여 사용해야 한다.

 

- 프로세스에 DLL이 로드될 경우 DLL내의 모든 전역및 정적변수들에 대해선 Copy on write 알고리즘이 적용된다.

 

 

Main 함수의 존재

- DLL은 라이브러리지만, 메인함수를 특정할 수 있다. 메인함수는 4가지 상황에서 호출된다.

  - 프로세스에 로드된 경우 (DLL_PROCESS_ATTACH) : 로드된 DLL을 대상으로

  - 프로세스에서 언로드된 경우 (DLL_PROCESS_DETACH) : 언로드된 DLL을 대상으로

  - 로드된 프로세스가 쓰레드를 생성한 경우 (DLL_THREAD_ATTACH) : 해당 프로세스의 모든 DLL을 대상으로

  - 로드된 프로세스가 쓰레드를 종료한 경우 (DLL_THREAD_DETACH) : 해당 프로세스의 모든 DLL을 대상으로

 

 

C Runtime library

- 프로그램, 또는 라이브러리가 c/c++로 작성된다면, 반드시 C Runtime library (CRT)를 로드해야 한다.

- 프로그래머는 이를 static으로 할건지 또는 dynamic으로 할건지 설정할 수 있다.

- static library을 사용할 때 주의점으로는 해당 라이브러리의 컴파일 시 설정된 CRT와 현재 프로그램의 CRT가 일치해야한다.

 

 

DLL의 장점

- 런타임상에서 라이브러리를 로드 언로드 할 수 있으므로 프로그램의 실행흐름을 유연하게 컨트롤 할 수 있다.

- 제품의 패치가 이루어지는 경우 수정된 DLL만 바꾸면 된다.

- 사용하지 않는 기능에 대해선 아예 모듈을 로드하지 않으므로 메모리가 절약된다.

- 기능을 수정할 경우 전체 프로젝트를 컴파일하는것이 아니라 해당 모듈만 컴파일 하면 되므로, 컴파일 시간이 매우 단축된다.

'개발' 카테고리의 다른 글

허프만 부호화  (0) 2023.09.09
댓글