본문 바로가기

Programming

윈도우 시스템 프로그래밍_8

[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 2007 윤성우 저
" 시스템 프로그래이란 하드웨어를 사용할 수 있도록 도와주는 프로그램"

= Window 운영체제 기반의 컴퓨터에게 일을 시키기 위한 프로그램 구현하는 것

 

21장 라이브러리와 printf

 

printf의 함수의 정의는 어디에 들어있는가

- 선언은 include stdio.h

- 정의는 Libcmt.lib/ Libcmtd.lib/ Msvcrt.lib/Msvcrtd.lib

*라이브러리 이름의 마지막이 'd'로 끝나는 경우는 디버그 모드로 컴파일할 때 사용되는 라이브러리이다.

 

 


 

정적 라이브러리 

*사용 방법

1. Additional Dependencies 포함시킬 라이브러리 이름 지정

2. #pragma comment(lib, "포함할 라이브러리 이름")

3. Additional Include Directories :  라이브러리 파일이 있는 위치 지정

 

링커 : 

(정적 라이브러리) 컴파일 된 .lib 과 .obj 파일을 묶어서 실행파일을 만든다. 

 


 

동적 라이브러리

.실행파일 밖에 독립적으로 라이브러리가 위치한다.

장점 :

1. .dll 은 가상 메모리 영역에 할당된다. .dll을 사용하는 프로세스는 자신의 가상 메모리 주소에 .dll을 매핑시켜서 사용한다. 여러 개의 실행파일이 실행되더라도 .dll에 관해서는 하나의 가상 메모리만 구성하게 된다. 

2. 여러 개의 프로세스가 스위칭 될 경우에도 정적 라이브러리의 경우 메인 메모리의 페이지가 완전 교체되지만 동적 메모리의 경우 메인 메모리에서 페이지 단위로 공유하기 때문에 사용하던 .dll을 그대로 사용할 경우 그대로 사용한다. 

 

암묵적 연결 

__declspec(dllimport)

: 함수를 라이브러리로 부터 제공받겠다.

__declspec(dllexport)

: 외부에 함수를 제공하겠다.

 

**정적 라이브러리를 만들면 .lib과 .dll 이 생성된다.

실행파일의 생성은 선언에 대한 정의가 완전히 존재해야 만들어진다. 그렇기 때문에 dll이 만들어질 때 .lib 파일도 함께 만들어진다. lib 파일에는 링커가 실행파일을 만드는 데 필요한 정보가 담겨있다. 

 

lib : "obj 파일에서 호출하는 @@함수는 dll에 잘 정의되어 있어!!"

: lib 파일은 링크할 때 필요하고 .dll 파일은 실행할 때 필요하다.

 

dll 파일 찾는 순서 

1. 실행파일이 존재하는 디렉터리

2. 프로세스의 현재 디렉터리

3. windows 시스템 디렉터리

4. windows 디렉터리

5. path 환경변수에 등록되어 있는 모든 디렉터리

 

*

.c 라면 표준 C 컴파일러를 통해 바이너리 코드 생성

cpp 라면 C++ 컴파일러를 통해서 바이너리 코드 생성

 

*

C를 사용하는 dll 라이브러리를 사용할 경우?

C++ 컴파일러는 컴파일 과정에서 Name Mangling : 이름을 엉망으로 만든다 작업을 한다. 이름을 바꾸는 규칙은 컴파일러에 따라 다르기 때문에 컴파일러가 다르면 호환이 안된다. (함수 이름으로 못 찾는다.)

extern C를 사용하면 Name Mangling을 막을 수 있어 컴파일을 할 수 있게 된다. (호출 하는, 호출되는 함수 모두 붙여준다.)

 

 

명시적 연결

소스 코드내에 dll 연결 코드가 명시적으로 존재한다면 명시적 연결, 아니라면 암시적 연결

명시적 연결에는 .lib 파일이 필요 없다.

 

LoadLibrary() 함수는 dll을 프로세스 가상 메모리에 매핑하는 기능을 제공. GetProcAddress 함수를 통해 필요한 함수의 포인터를 획득하여 이 포인터로 dll이 제공하는 함수를 호출할 수 있다.

FreeLibrary() 함수를 호출하여 dll을 반환한다. (가상 메모리 반환)

** Dll  의 레퍼런스 카운트는 프로세스별로 독립적이다.

** Dll 이 필요한 시점에서 로딩하고 불필요해지면 반환한다.

*** 프로그램 실행 중에 DLL 교체 및 선택이 가능하다.

*** 암묵적 연결방식은 프로그램 실행 전에 필요한 DLL을 메모리에 로딩한다. 하지만 명시적인 연결의 경우 필요한 순간에 하나씩 DLL을 로딩한다.

 

 

QQ)

AAA의 가상메모리에 good.dll best.dll 을 적재할 경우

BBB의 가상메모리에  best.dll 적재할 경우 순서 때문에 다른 주소에 올려놓게 된다. 이런 경우 메모리에 두 번 이상 올라가게 된다.

 

Q) 프로세스들은 독립된 영역을 가지는데 어떻게 dll을 공유하나요?

각 프로세스 마다 공유 영역이 있어서 dll 파일은 이 영역에 올라가 공유되게 된다.

참고 : sinun.tistory.com/99

 

[Reversing] 윈도우 가상메모리와 DLL

1. 가상메모리 프로그램이 물리적인 메모리 주소를 사용하게 될 경우 메모리(RAM) 부족으로 인하여 사용하지 않는 부분을 땡긴다거나 하는 작업이 일어날 경우 현재 프로그램이 사용하고 있

sinun.tistory.com

 

*

#ifdef __cplusplus  extern "C' : 해당 구간을 모두 C 스타일로 해석하라.

 

 

 

 

 

'Programming' 카테고리의 다른 글

이펙티브 모던 C++_2  (0) 2020.11.08
이펙티브 모던 C++_1  (0) 2020.11.01
윈도우 시스템 프로그래밍_7  (0) 2020.10.18
윈도우 시스템 프로그래밍_6  (0) 2020.10.11
윈도우 시스템 프로그래밍_5  (0) 2020.10.04