맨날 DLL 사용하고 쓰면서 대충? 사용하는 느낌이 많았다.
여유로울때 정리해놓으려 한다.
[생각나는대로 막 정리하는 개인노트]
DLL이란 Dynamic Linked Library의 약자이다.
실행파일에 함수들을 합쳐서 배포하는게 아닌, 사용하는 함수들을 따로 파일로 빼놓은 개념이다.
해당 DLL을 사용 할 때도, 한번에 다 사용하는개념이 있고, 필요한 함수만 사용하는 개념이 있다.
DLL을 처음 프로그램 실행 할때 같이 load해서 사용하는 방법이 있다.
반면에 해당 함수가 필요하는 시점에 dll을 로드하고 해체하는 방법이 있다.
정확한 명칭들은 기억이 나지 않는다.
DLL이 Injection이 되고 이럴때 분석하는 방법은 예외 처리에서 dll 로드 될때 따로 불러주는 예외가 있었다.
해당 예외를 이용해서 디버거에서 DLL이 로드 될 때, 잡아준다. 해당 기능을 이용해서 분석하면 편하다.
그리고 DLL을 만들때의 개념이다.
#include "stdafx.h" 라는 문구가 있다.
그냥 막 사용할때는 궁금하지 않았는데, 찾아보았다.
DLL에서 사용하는 헤더들을 한번에 정의해놓은 헤더의 개념이다.
밑의 그림으로 간단하게 표현했다.
DLL에서 사용하는 함수를 정의 할 때 앞에 extern, declspec와 같은 내용을 정리하고자 한다.
extern 키워드
해당 키워드에 관해서 알아보고자한다.
C에서는 같은 이름의 함수를 만들 수 없는 것은 알고 있다.
하지만 C++에서는 이름이 같은 함수를 만들수 있다.
C++ name mangling이라는 개념이 존재한다.
Compiler가 임의로 함수나 변수의 이름을 변경하는 것이다.
더하기 함수를 Oerloading 한다고 생각하면
int ADD(int arg1, int arg2) {return arg1+arg2;}
double ADD(double arg1, double arg2) {return arg1+arg2;}
float ADD(float arg1, float arg2) {return arg1+arg2;}
와 같이 오버로딩 할 수있다.
컴파일러는 해당 기능을 지원하기 위해 name mangling을 지원하는데,
예를들어서
int ADD(int arg1, int arg2) => int + Add + int + int => iADDii
double ADD(double arg1, double arg2) => double + ADD+ double + double => dADDdd
float ADD(float arg1, float arg2) => float + ADD + float + float => fADDff
위와 같이 표현이 가능하다.
하지만 C에는 위와 같은 개념이 존재하지 않는다.
단지 함수 하나당 하나의 심볼만 존재한다.
이러한 다른 메카니즘을 이용하기 때문에, C에서 C++[DLL] 함수를 사용하기 때문에 에러가 발생할 것이다.
이러한 것을 예방하고자 extern "C"을 사용해서 Name mangling하지 말라는 의미로 붙이는 것이다.
__declspec (dllimport), __declspec (dllexport)
위와 같은 개념에서 __declspec은 무슨 뜻인지 모르겠지만,
위와 같은 접두사?를 붙이는 건 DLL에서 해당 함수가
외부에서 사용할 함수인가?
아니면 내부에서 사용하는 함수인가?
이것을 표시해주는 것이다.
'기타[etc]' 카테고리의 다른 글
[QEMU] Rpi jessi (0) | 2016.12.06 |
---|---|
C++ Virtual (0) | 2016.11.27 |
효율적인 strstr 함수 만들기 (0) | 2016.11.20 |
Python Module install (0) | 2016.11.10 |
OS 만들기 - 1 (0) | 2016.01.10 |