-startup code--------------------------------------------------------------------------
STARTUPTEXT
LEAF_ENTRY StartUp
-중략-
LTORG
ALIGN 32
Reset_Handler
-분석----------------------------------------------------------------------------------
STARTUPTEXT - 코드가 시작되는 텍스트 세그먼트 영역
이 매크로는 현재 지정된 섹션을 '.astart'에 설정한다.
kxarm.h에 아래와 같이 선언되어 있다.
MACRO
STARTUPTEXT
AREA |.astart|,ALIGN=2,CODE
AreaName SETS "|.astart|"
MEND
AreaName - 지정된 '.astart'가 되는 area의 name 또는 section
ALIGN - section boundary를 정의한다. pression은 ELF 섹션을 2expression -byte만큼 정렬한다.
0에서 31까지의 integer를 가질 수 있다. code section에서sms ALIGNE=0, ALIGN=1을 사용하지 않는다. ALIGN attribute는 ALIGN directive와 같지않다.
LEAF_ENTRY - prolog code에서 요구되지 않는 routine의 시작을 선언하는 매크로이다.
LEAF_ENTRY Name[,
[Section=]SectionName]
name - routine name
SectionName - 옵션. entry에 나타나는 section의 이름으로 디폴트는 '.text'이다.
Remarks
Name는 global name space에 있다. LEAF_ENTRY는 반드시 ENTRY_END와 같이 써야 한다.
ALIGN - ALIGN {<expression>, {<offset>}}
다음 명령어의 주소를 q*<expression>+<offset>으로 정렬한다. 이 정렬은 ELF 섹션의 시작에 대해 상대적이므로, 적절하게 정렬되어 있어야 한다. <expression>은 2의 배수이어야 하고, 디폴트 값은 4이다. <offset>은 별도로 지정하지 않으면 0이다.
LTORG - 리터럴 풀을 삽입하기위해 사용. 어셈블러는 LDR Rd, =<value> 명령어에 나와 있는 상수를 저장하기 위해 리터럴 풀을 사용한다. 보통 어셈블러는 각 영역의 끝에 리터럴 풀을 자동으로 삽입한다. 하지만 영역이 너무 크다면 LDR 명령어는 pc-상태 주소를 사용하여 이 리터럴 풀에 도달할 수 없다. 그런 경우에는 LDR 명령어 근처에 직접 리터럴 풀을 삽입해야한다.
-용어정리------------------------------------------------------------------------------
Literral Pool - 프로그램에서 사용되는 대부분의 데이터는 코드의 마지막에 위치한다. 하지만 pc-relative에서 사용되는 경우 실제 명령이 있는 PC의 위치에서 4K바이드 이내에는 아주 작은 프로그램을 제외하면 대부분 코드가 있기 때문에 데이터는 코드 내의 중간에 삽입된다. 이와 같은 영역을 리터럴 풀(literal pool)영역이라고 한다.
ELF - Excutable and Linking Format
.astart
다음은 eboot.map파일의 일부이다.
EBOOT
Timestamp is 46e4a9fa (Mon Sep 10 11:20:42 2007)
Preferred load address is 00010000
Start Length Name Class
0001:00000000 000014c4H .astart CODE
0001:000014d0 00006c13H .rdata CODE
0001:000080e4 00000055H .rdata$debug CODE
0001:0000813c 000166b0H .text CODE
0001:0001e7ec 00000000H .edata CODE
0002:00000000 0000010cH .data DATA
0002:00000120 00010714H .bss DATA
0003:00000000 000009a8H .pdata DATA
section 001 - 프로그램 실행 코드
section 002 - 읽기 전용 정적 데이터
section 003 - 읽기/쓰기 정적 데이터
section 004 - 다른 DLL을 호출하는 데 필요한 재배치 테이블(fix-up table)
section 005 - 리소스 섹션, 메뉴와 대화 상자 템플리트 같은 응용프로그램 리소스
.data 섹션 - 초기화된 읽기/쓰기 데이터가 들어간다.(세그먼트와 섹션은 혼용하여 사용하는것 같다.)
static HINST g_hLoadlib = NULL;
.bss 섹션 - 초기화되지 않은 읽기/쓰기 데이터가 들어간다.
static BYTE g_ucItems[256];
.rdata - 읽기전용 데이터가 들어가는 세그먼트
const struct decodeUINT MainMessage[] = {
WM_CREATE, DoCreateMain,
WM_SIZE, DoSizeMain,
WM_COMMAND, DoCommandMain,
WM_DESTROY, DoDestroyMain,
};
.map파일 - 디버깅을 위해 함수와 데이터의 위치를 파악하는데 사용된다. 텍스트 파일로서 program에 link되는 정보를 포함한다.
- 파일의 이름에 기초한 모듈이름
- 프로그램 파일 헤더로 부터의 timestamp(file system이 아니다.)
- 각 그룹의 start address, length, group name, class를 포함한 프로그램내의 그룹 리스트
- 각 어드레스, symbol name, flat address, symbol에 정의된 .obj file을 포함한 public symbol 리스트
- entry point
-참고----------------------------------------------------------------------------------
MSDN, Google
ARM System Developer's Guide
ARM으로 배우는 임베디드 시스템
PROGRAMMING MICROSOFT WINDOWS CE .NET