반응형

.map 파일

 

n  map 파일이란?

ü  Application 빌드 시 생성되는 map 파일은 빌드 된 실행파일이 메모리에 로드 되었을 때, 전역변수, 함수가 위치할 Address를 기록해 놓은 파일입니다.

ü  Symbol파일이 없는 경우, 함수의 주소를 알고자 하거나 특정 Address가 어느 함수인지 확인 하는 용도로 활용할 수 있습니다.

 

n  map 파일 생성

ü  VC++ : [ 프로젝트> 속성> 구성속성> 링커> 디버깅 ]에서 맵 파일 생성을 예(/MAP)으로 설정하신 후 빌드 하시면 됩니다.


ü  드라이버 : SORCES파일에 아래의 한 줄을 추가해 주시면 됩니다.

 

LINKER_FLAGS=$(LINKER_FLAGS) –MAP

 

 

그럼 mapfile을 통해 함수와 Address를 확인 하는 방법을 알아 보겠습니다.

 

#include "stdafx.h"

#include <WTypes.h>"

 
DWORD g_dwDummy;

void DummyFunction_A()

{

           int a= 0;

           a++;

 

           return;

}

 

void DummyFunction_B()

{

           int b = 0;

           b--;

 

           return;

}

 

void DummyFunction_C()

{

           int c = 0;

           c += 2;

 

           return;

}

  

int wmain(int argc, _TCHAR* argv[])

{

           HMODULE hInst = ::GetModuleHandle(NULL);

           DummyFunction_A();

           DummyFunction_B();

            

           printf( "Module Base Address: %#p\n", (void *)hInst);

           printf( "DummyFunction_A() Function Address: %#p\n", (void *)DummyFunction_A);

           printf( "DummyFunction_B() Function Address: %#p\n", (void *)DummyFunction_B);

           printf( "g_dwDummy Global Variable Address: %#p\n", &g_dwDummy);

 

           return 0;

} 


프로젝트 속성을 맵 파일을 생성하도록 설정한 후, 아래의 소스를 빌드하게 되면, TestApp.map이라는 파일이 생성되게 됩니다.

 

생성된 map파일의 내용은 아래와 같습니다.

 

제일 먼저 눈여겨 보아야 할 것은 제일 위의 빨간색 박스 안에 있는

Preferred load address is 00400000

입니다.

 

이 라인의 의미는 해당 바이너리가 메모리에 로드될 때 Base주소로 0x00400000 Address를 사용하겠다는 의미입니다.

Vista이하의 경우, Exe형태의 PE파일들은 대부분 설정을 변경하지 않는 이상 Preferred load Address로 0x00400000 Base주소로 사용하며, 실제로도 해당 Address에 모듈이 Load됩니다.
하지만 Win7의 경우에는 Exe형태의 PE파일이라 하더라도 Base주소가 변경되는 경우가 빈번히 발생합니다.
 

- 디버깅시 메모리에 로드된 모듈의 Base주소가 0x00400000라면 위의 파란 박스 안에 있는 Rva+Base 주소가 해당 함수의 주소가 됩니다.

- 만약 메모리에 로드된 모듈의 Base주소가 변경되었다면 다음과 같이 계산하시면 됩니다.

DummyFunction_A() Address

= 0x00401000(Rva+Base) – 0x00400000(Preferred load Address) + Module Base주소

 

그러면 실제로 map파일에서 추출한 함수 주소와 실제 메모리에 로드된 모듈의 함수주소가 같은지 확인 해 보겠습니다.
 

n  메모리에 로드된 후 함수&전역변수의 실제 Address

 

 

n Mapfile을 통한 함수,전역변수의 Address계산

DummyFunction_A() = 0x00401000 – 0x00400000 + 0x01230000 = 0x1231000

DummyFunction_B() = 0x00401020 – 0x00400000 + 0x01230000 = 0x1231020

g_dwDummy = 0x00403374 – 0x00400000 + 0x01230000 = 0x1233374


보시는 것과 같이 map파일을 통해 계산한 값과 메모리에 로드된 후의 Address가 일치함을 알 수 있습니다.

 

* 함수 DummyFunction_A()함수가 ?DummyFunction_A@@YAXXZ 로 변경되는 이유가 궁금하신 분은 아래의 링크를 참고하십시오
2008/10/07 - [C/C++] - Name Mangling(Name Decoration)

반응형

'C++' 카테고리의 다른 글

Cross Compile - Predefined Macros for OS  (0) 2020.06.18
fprintf(),fwprintf()로 한글이 출력되지 않는 문제  (0) 2011.08.11
Format Specification  (0) 2011.04.20
std::map  (0) 2009.09.03
std::vector  (0) 2009.08.26

+ Recent posts