2008-10-08 3 views
2

Visual Studio의 MAP 파일에있는 함수 주소 (Rva + Base)가 디버거에 표시된 것과 일치하지 않습니다 (또는 스택 프레임을 수동으로 검사 할 때).Visual Studio MAP 파일의 잘못된 함수 주소

이 문제의 원인은 무엇일까요?

/A.B.

+0

이것이 http://stackoverflow.com/questions/2485336/address-of-function-is-not-actual-code-address와 중복되는지 확인하십시오. – rwong

답변

2

실행 파일이나 DLL에 문제가 있습니까?

DLL 인 경우 선호로드 주소는 무엇입니까? 이 DLL이 다른 DLL과 충돌하면 로더에 의해 리베이스되고 이로 인해 사용자가보고있는 것으로 이어질 수 있습니다.

빌드 프로세스의 일부로, 주소 공간이 충돌하지 않도록 모든 DLL을 리베이스 (rebase)해야합니다 (이로 인해 일부 페이지 파일 공간이 확보되고로드가 향상됩니다). 시각).

1

연결시/FIXED 명령 줄 옵션을 지정하지 않으면 exe와 dll을 모두 재배치 할 수 있습니다. 다음 명령을 사용하여 내 exe가로드 된 위치를 확인하기 위해 실제 주소를 확인하므로 맵 파일에 대한 오프셋을 계산할 수 있습니다. 코드 주소는 "모듈"창에서 볼 수있는 범위 내에있는 경우

static void KnownFunctionAddress(){} 

... 

// check an address of a known function 
// and compare this to the value read from the map file 

intptr_t CheckRelocationOffset(MapFile map) 
{ 
    intptr_t mapAddress = map.PhysicalAddress("[email protected]@YAXXZ"); 
    intptr_t realAddress = (intptr_t)KnownFunctionAddress; 

    return realAddress-mapAddress; 
} 
0

디버거에있는 코드로 스테핑, 당신은 확인할 수 있나요? 때로는 같은 코드가 동일한/다른 이름의 여러 모듈에 존재할 수 있습니다.

코드가 들어있는 "모듈"을 식별하면 Modules 창의 기본 주소를 사용하여 DLL 진입 점 주소에 도달 (뺄셈)합니다.

마지막으로 컴파일 타임이나 런타임에 추가 할 수있는 일종의 함수 호출 간접 참조 인 엔트리 점프 테이블 (trampoline)의 효과도 있습니다. 따라서 "진입 점"주소는 연기 화면 일 수 있으며 기능 본문의 주소와 일치하지 않습니다.

(내 대답에 부정확가있을 수 있도록 DLL 구조의 나의 이해는 제한되어 있습니다.)

0

나는 어떤 이유로 수마의 답장에 답장 할 수 아니에요,하지만 당신은 단지 다음과 같은 작업을 수행 할 수 :

extern "C" struct IMAGE_DOS_HEADER __ImageBase; // On platforms other than Win32/Win64, this MAY be a different header type... 
... 
printf_s("base: %p", &__ImageBase); 

__ImageBase은 (적어도 VC++) 링커에 의해 정의되며, 해당 주소를 복용하면 런타임에 이전되는 경우에도, 당신에게 모듈 (EXE/DLL)의 기본 주소를 제공 할 것입니다.

는 당신에게 동일한 기본 주소 값을 제공 할 수있는 또한

printf_s("calling module's base: %p\n", GetModuleHandle(NULL)); 

있다 ... 그러나 더주의 사항 (플러스는 WINDOWS.H 필요) GetModuleHandle 함수에있다 그래서 난 그냥 __ImageBase을 고수하는 것이 좋습니다.

다른 사람들이 언급했듯이 문제는 아마도 모듈을 재배치하는 Windows와 관련이있을 것입니다. 모듈 파일에 .reloc 섹션이 없으면 파일을 재배치 할 수 없습니다.이 경우 rwong과 같은 trampolines 또는 rwong과 유사합니다.

관련 문제