본문 바로가기

프로그래밍 일반/JAVA

[C++] #import <헤더파일>시에 일어나는 일들

#include <헤더파일>컴파일러가 설치된 폴더에서 헤더파일을 찾으라는 지시입니다.

만약에 #include <cstring>을 선언하면 main()함수 안에 strcpy()를 사용할 때, cstring에서 strcpy() 함수를 찾는 것이 아닙니다. 헤더파일에는 strcpy()함수가 실제로 들어있지 않습니다.

<cstring>헤더 파일은 strcpy()함수의 선언만 들어있으며, strcpy()가 호출되면 C라이브러리 코드를 호출함.

컴파일 할 때 <cstring>의 역할은 strcpy()함수의 호출이 정확한지 판단하는 데 사용됩니다.

 

그러면 실제로 Visual Studio에서 실제로 헤더파일이 import되고 <cstring>과 같은 헤더 파일 내부를 들여다보면 된다.

 

 실제로 위와 같이 헤더파일을 선언하면, 헤더 파일위치로 가서 함수가 맞는지 확인한 뒤에, C++라이브러리에서 기계어 형태의 코드를 호출합니다. 실제로 코딩의 순서를 찾기 위해 먼저 헤더파일을 열어보겠습니다. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include 에 헤더파일 iostream이 위치하고 있으며, include <iostream>에서 iostream을 우클릭한 후에 상세히 보기로 들어갈 수 있습니다.

 

우측에 파일은 실제 경로로 들어가서 연 것이고, 왼쪽은 iostream문서 열기로 연 파일이다.

 

 

이 파일을 열어보면 istream객체를 import한 다음에 cin이라는 이름의 객체로 선언한다는 것을 알 수 있습니다. 이제 이 istream을 알기 위해 아까와 마찬가지로 우클릭한 후에 정의로 이동을 클릭합니다. 그러면 basic_istream이라고 나오고, basic_istream을 우클릭 한 후에 정의로 이동한 뒤에 아래로 내려가 보면 operator >>이 재정의되어 있습니다.

 

 

 

 

 

 cin >> A라고 하면, A의 주소에 __cdecl형식의 함수로 *Pfn(A주소)에 basic_istream&이 동작합니다. 그리고 *__Pfn에 값을 return 합니다. 그런데 basic_istream&에서 basic_istream의 정의를 보려 해도 상세한 정보는 나오지 않습니다.

 

 

 

위쪽에서 문서를 계속 문서 열기를 하면 된다.

 

그 이유는 iostream은 istream을 상속받고, istream은 ostream을 상속 받고 ... 이렇게 가기 때문입니다. 그렇게 해서 결국 stdio.h라는 C라이브러리 헤더파일까지 가게 됩니다. C언어는 메모리의 주소인 포인터를 다룰 수 있는 언어로, 마우스나 키보드가 메모리에 있기 때문에 메모리를 다룰 때는 결국 C언어라이브러리를 import 합니다.

 

 

C언어나 import하는 것들은 결국 마지막에 systemlibrary를, 모니터와 키보드등의 입출력을 buffer을 다루는 곳까지 들어가게 됩니다. C라이브러리는 마지막에 system32에 dll파일이나 visual studio의 dll파일을 이용하게 되면서 import되게 됩니다.

 

요약해드리면 #import <iostream>이나 <cstring>을 선언했을 때, <iostream>이나 <cstring>에 재정의한 함수만 있지, 입출력과 관련된 함수가 있지 않습니다. <iostream>이나 <cstring>은 실제 입출력을 실행하는 C라이브러리로 가기 위한 검문소 역할을 하게 됩니다. iostream에 내용이 확인되면 해당 파일을 찾기 위해 stdio.h 까지 쭉 거슬러 올라가서 system32의 dll이나 VC의 bin파일에 MV.dll파일등을 참조하게 되는 것입니다.

 

그래서 보통 시스템 해킹을 하기 위해서는 이 systemlibrary를 이용하게 됩니다.