기준: Visual Studio 2008 Professional KOR.

 

C++ Win32 프로젝트를 추가하면 기본적으로 32비트 환경으로 Debug/Release가 생깁니다.

기존에 있는 Win32용 빌드 구성을 이용해서 x64용으로 구성을 복사할 수 있다.

 

'Hello64 프로젝트'로 64비트 환경 구축하기

Win32 콘솔 애플리케이션 프로젝트를 생성해서 64비트용으로 빌드를 해보겠다.

 

우선 VS2008을 실행하고, 새 프로젝트에서 Win32 콘솔 응용 프로그램을 생성한다.
이미 익숙하다고 가정하고 스크린샷을 붙인다.

1_make_proj.png 

 

'빈 프로젝트'를 선택한다.

2_empty_proj.png

 

간단하게 cpp파일을 추가하고 main()함수를 타이핑합니다.

3_main.png 

빌드를 해보면 별다른 성공해야 합니다.

 

기존 프로젝트에 솔루션 플랫폼 도구모음에 보면 기본적으로 Win32용으로 선택된 플랫폼이 있습니다.

"구성 관리자..." (Configuration Manger) 를 선택하면 아래와 같은 창이 나옵니다.

4_setup_configuration.png  

 

"새로 만들기..." (New...) 를 선택해서 '새 플랫폼 입력 또는 선택' (Type or select the new plaform:)에서 x64를 선택하고

5_configuration_new.png 

 

다음 나오는 창에서 '새 플랫폼 입력 또는 선택'에서 X64를 선택해 줍니다.

6_new_platform.png 

 

이후에 보면 기존의 'Win32'이외에 x64가 있습니다. 선택하고 빌드를 해봅니다.

7_build64.png 

 

출력되는 경로는 [프로젝트 경로]\x64 폴더 아래에 Debug 혹은 Release 폴더가 생긴다.

아래 그림은 Release로 빌드를 했다.

8_output_exe.png 

 

32비트로 빌드한 것과 비교해본다.(위: 64비트 / 아래: 32비트)

9_compare_32vs64.png 

아래 부분에서 선택한 영역은 'IMAGE_NT_HEADER' 영역의 시작부분인 Machine이다. (winnt.h에 정의되어 있다)

  1. typedef struct _IMAGE_FILE_HEADER {

        WORD    Machine;

        WORD    NumberOfSections;

        DWORD   TimeDateStamp;

        DWORD   PointerToSymbolTable;

        DWORD   NumberOfSymbols;

        WORD    SizeOfOptionalHeader;

        WORD    Characteristics;

    IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

 

WinNT.h에 있는 매크로의 정의를 보면 다음과 같다. (리틀엔디안이라 Byte order가 다르다)

  1. #define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386.

     

  2. ...

    #define IMAGE_FILE_MACHINE_AMD64             0x8664  // AMD64 (K8)

  3. ...

 

참고(PE)

IMAGE_NT_HEADER는 IMAGE_NT_HEADERS의 서브셋(부분집합)이다.

IMAGE_NT_HEADERS는 크게 3가지 타입이 있는데 IMAGE_NT_HEADERS64, IMAGE_NT_HEADERS32, IMAGE_ROM_HEADERS 이다.

3가지의 차이는 앞부분 PE시그너처랑 는 동일하고 뒷부분의 OptionalHeader 만 다르다.

  1. typedef struct _IMAGE_NT_HEADERS {

        DWORD Signature;

        IMAGE_FILE_HEADER FileHeader;

        {IMAGE_OPTIONAL_HEADER64 or IMAGE_NT_HEADERS32 or IMAGE_ROM_HEADERS} OptionalHeader;

    IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;

 

IMAGE_FILE_HEADER 바로 전에 PE시그너처가 있는데 '50 45 00 00'이 바로 그것이다. (아래는 리틀엔디안 표현이라서 순서가 바뀌어져있다)

  1. #define IMAGE_NT_SIGNATURE                  0x00004550  // PE00

 

PE_signature.png 

 

참고(엔디안)

빅 엔디안: 높은 자리수를 먼저 저장(모토롤라 계열) - 사람이 읽기에 편함

리틀 엔디안: 낮은 자리수를 먼저 저장(인텔 계열) - 기계가 연산시에 편리(캐리지가 발생시 -> 방향으로 진행 가능)

image002.gif 

 

반응형

+ Recent posts