ARM Make 분석

ARM 2008. 10. 24. 10:13

AT91SAM7S256 Makefile에 대한 설명

#-----------------------------

# 2008 Mecha Cource - By CM WC, 2008.09.10.

#-----------------------------

ifndef ERASE_FCT// ERASE_FCT 가 정의되어 있지 않다면 정의함

ERASE_FCT=rm -rf// 삭제시 사용할 명령어

endif

ifndef WCCROSS_COMPILE// WCCROSS_COMPILE 가 정의되어 있지 않으면 정의

WCCROSS_COMPILE=arm-elf-// GNUARM의 실행파일명의 일부를 정의

endif

WCTOOL=gcc// GCC 컴파일을 선언

WCOUTFILE_SRAM=at91sam7s_sram_wc// 생성할 기술파일명을 선언함

WCOUTFILE_FLASH=at91sam7s_flash_wc// 생성할 기술파일명을 선언함

WCTARGET=AT91SAM7S256// 타겟은 현재 사용중인 ARM칩으로 설정

WCINCL=./include// 해더파일의 경로를 설정함

# Debug Mode

OPTIM=-Os

// Make 에 내부적으로 미리 정의되어 있음

ifeq ($(WCTOOL), gcc)// define으로 선언된 WCTOOL와 gcc 비교. 만약

AS=$(WCCROSS_COMPILE)gcc// WCTOOL과 gcc가 같다면 밑에있는 endif까지 실행함

CC=$(WCCROSS_COMPILE)gcc// AS는 전처리기. CC는 C컴파일러

LD=$(WCCROSS_COMPILE)gcc// LD는 링커 GCC의 경우 3가지를 모두 포함함

OBJCOPY=$(WCCROSS_COMPILE)objcopy

// 오브젝트 파일을 다른 오브젝트 파일로 복사할 때 사용하는데, 선택적으로

필요한 부분만을 복사할 수 있기 때문에 파일의 사이즈를 줄이는 데 주로 사용되고,

바이너리 포맷을 바꾸는 데도 이용 됨.

OBJDUMP=$(WCCROSS_COMPILE)objdump

// 오브젝트 파일에 대한 정보를 출력한다. 옵션은 어떤 정보를

출력할지 결정함

NM= $(WCCROSS_COMPILE)nm

SIZE=$(WCCROSS_COMPILE)size

CCFLAGS=-g -mcpu=arm7tdmi $(OPTIM) -Wall -I$(WCINCL) -D$(WCTARGET)

// C컴파일러 플래그 정의 (object 파일을 만들기 위함). 내부적으로 정의됨

ASFLAGS=-D__ASSEMBLY__ -D$(WCTARGET) -g -mcpu=arm7tdmi -c $(OPTIM) -Wall -I$(WCINCL)

// 전처리기 플래그 정의 (object 파일을 만들기 위함). 내부적으로 정의됨

LDFLAGS+=-nostartfiles -Wl,--cref

LDFLAGS+=-lc -lgcc

LDFLAGS+=-T elf32-littlearm.lds

// 오브젝트 파일을 링킹 시킬대 사용할 플래그를 정의

OBJS=cstartup.o

endif

OBJS+= lowlevel.o \

main.o

OBJS 는 위에서 보면 cstartup.o 와 lowlevel.o main.o 를 의미함.

3가지 파일이 없기 때문에 각각의 라벨을 찾는다

처음에는 cstartup.o 라벨로 점프 해서 작업을 수행하고 작업완료 하면 lowlevel.o

라벨로 점프해서 작업. 그다음 main.o 로 점프해서 작업을 함.

각각의 작업을 완료하고 나면 sram 라벨로 돌아와서 다음 작업을 수행함

sram 작업이 끝나면 flash 작업을 수행

실행 순서

all->sram->$(OBJS) ->cstartup.o->sram->$(OBJS) ->lowlevel.o ->sram->$(OBJS) ->main.o->sram완료->all->flash->flash완료->all 완료

(6->5->4->2->3->1->) 순서임

all: sram flash

@echo "============111111111111111111111111==============="

rebuild: clean all

sram: $(OBJS)// Ttext는 사용할 처음 주소를 나타냄

@echo "============222222222222222222222222222============="

$(LD) $(LDFLAGS) -Ttext 0x201000 -Tdata 0x200000 -n -o $(WCOUTFILE_SRAM).elf $(OBJS)

$(OBJCOPY) --strip-debug --strip-unneeded $(WCOUTFILE_SRAM).elf -O binary $(WCOUTFILE_SRAM).bin

@echo "============2-------------------------2============="

flash: $(OBJS)// Ttext는 사용할 처음 주소를 나타냄

@echo "============333333333333333333333333333============="

$(LD) $(LDFLAGS) -Ttext 0x100000 -Tdata 0x200000 -n -o $(WCOUTFILE_FLASH).elf $(OBJS)

$(OBJCOPY) --strip-debug --strip-unneeded $(WCOUTFILE_FLASH).elf -O binary $(WCOUTFILE_FLASH).bin

@echo "============3-------------------------3============="

main.o: main.c// 미리정의된 C컴파일러 플래그를 이용하여 오브젝트 파일생성

@echo "============444444444444444444444444444============="

$(CC) -c $(CCFLAGS) main.c -o main.o

@echo "============4-------------------------4============="

lowlevel.o: lowlevel.c// 미리정의된 C컴파일러 플래그를 이용하여 오브젝트 파일생성

@echo "============555555555555555555555555555============="

$(CC) -c $(CCFLAGS) lowlevel.c -o lowlevel.o

@echo "============5-------------------------5============="

cstartup.o: cstartup.S// 미리정의된 전처리기 플래그를 이용하여 오브젝트 파일생성

@echo "============666666666666666666666666666============="

$(AS) $(ASFLAGS) cstartup.S -o cstartup.o

@echo "============6-------------------------6============="

clean:// *.o, *.bin, *elf, * map 파일 clean

@echo "============777777777777777777777777777============="

@clear

$(ERASE_FCT) *.o *.bin *.elf *.map

@echo "============7-------------------------7============="

Posted by 응이

ARM-JTAG-SAMBA 메뉴얼

ARM 2008. 10. 24. 10:13

내용확인은 파일로...
Posted by 응이

elf32-littlearm.lds 분석

/* 2008.09.10. */

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

/*ELF32의 little endian으로 코드를 생성하겠다.*/

/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/

OUTPUT_ARCH(arm)/* binary를 실행할 수 있는 CPU architecture로 Arm*/

ENTRY(reset_handler)/* 프로그램의 시작을 가리키며, 시작되는 함수의 */

/* 이름은 "reset_handler"*/

/* reset_hanger은 cstartup.S의 파일에 있는 루틴*/

SECTIONS

{

.text : { /*실행할 프로그램 코드영역 */

_stext = .;/*Makefile파일에서 가져와서 넣어준다 . 운영체제가.*/

*(.text)/*함수위치*/

*(.rodata)/*Read only Data의 위치 */

*(.rodata*)/*그외에 잡다한것들 */

. = ALIGN(4);/*4바위트 단위로 */

_etext = . ;/*텍스트 영역의 끝주소*/

}

/* collect all initialized .data sections that go into FLASH */

.data : AT ( ADDR (.text) + SIZEOF (.text) ) {

_sdata = .;/* 텍스트 영역의 시작주소 Makefile 로부터 받아옴 */

*(.vectors)/* 벡터테이블 */

*(.data)/* 초기화된 데이타 영역 */

_edata = .;/* 마지막주소 End */

}

/* collect all uninitialized .bss sections that go into FLASH */

.bss (NOLOAD) : { /* 0값이므로 마지막을 게산할 필요가 없음 */

. = ALIGN(4);

_sbss = .;

*(.bss)/*초기화되지 않은 데이타 영역 */

_ebss = .;/*bss영역의 마지막 주소 */

}

}

end = .;

Posted by 응이

Dream come true.
응이

달력

태그목록