1. extern :: linker 에게 구멍 위치를 알려준다는 느낌
섹션별로 분리하고 모으고 분리하고 모으고.. > 실행가능한 파일로 만들어줌
> Relocate
// Segment = ∑ Sections
2. Linker 의 link rule ( 동일한 이름의 Global symbol )
>
strong : 함수와 초기화가 된 전역변수
Weak : 초기화가 되지 않은 전역변수
1) 여러 개의 Strong Symbol > X :: Link error
2) 한개의 Strong Symbol, 여러 개의 Weak Symbol >> Strong Symbol 선택
3) 여러 개의 Weak Symbol > 아무거나 하나 골라서 선택
// Flag : True, false
> static으로 선언 > 다른 file 에서 참조 X
3. DWARF :: ARM의 debug 방식
> ICD (In circuit debugger - Trace32) > Debugging
4. -Linker: Execution View를 참조,
Bootloader : LoadView를 참조 > Execution View로 만듬!
5. XIP : Execution In Place > 직접 SW executive 가능
>
Memory :: code
Data :: R/W 가능한 영역
>> 그래야 그 안에서 XIP 가능
>>>
Linker Descript Script (Scatter Loading) // *.scl , GNU할때
> Input section, Region 만 잘 표기 > 나머진 linker가
Load view : SW 실행전 저장매체 (ROM, RAM) 에 담겨있을때
Execution view : SW 실행될때
/*
RAM : Read Write 가능 but 사라짐
ROM : Read Only but 유지
*/
RW section ::
ROM 으로 데이터 값을 저장하고 있어야함
+
프로그램 실행중 값 변경 되어야함
> ROM 에서 보관 RAM 에서 실행
NOR Flash : XIP 가능 > Flash 에서 그대로
NAND Flash : XIP 불가 > SDRAM 같은곳으로 옮겨 줘야함 (Load > Execution)
5-1)
Load View : ZI 필요 X > 어짜피 0 이라 아무렇게나
<> Execution View : 실행할땐 0 의 값이 필요
5-2)
ex) NOR + PSRAM
RO : Load view 그대로 (NOR:: Flash)
RW, ZI : Execution view
6. BSS : Block Started by Symbol
~= ZI영역 :: RAM 에 0 으로 채워짐 <> ROM 에는 안잡힘
>
(ROM)
$$ 을 이용한 symbol 로 시작과 끝만 알려줌
>>
ZI 는 symbol로 이름만 잡혀져있음
7. Map file
a) Image Symbol Table
b) Memory Map of the image
c) Image component sizes
d) 전체 Layout
>
Image Symbol Table 찾고 > symbol 확인
> Layout 에서 Memory 양 확인
8. Makefile
목적 : 종속
목적을 위한 명령어
>
spaghetti.bin : spaghetti.elf
fromelf -bin -o spaghetti.bin spaghetti.elf
선언법
CC := tcc
TEMP := $(CC) temp :: 이전에 선언이 되어있어야 따름
TEMP = $(CC) temp :: 어디에 있는 상관없이
TEMP += $(CC) temp :: 각 변수마다 띄어쓰기를 해줌
TEMP ?= $(CC) temp :: 선언된게 없다면 // #ifdef
$(TARGET) : $(ELF_TARGET)
$(BINTOOL) -bin -o $@ $^
Compiler 가 위의 TARGET , ELF_TARGET ,BINTOOL 을 보고
알아서 해당되는 $@ 와 $^을 처리해줌
SRC = $(wildcard *.c) : 모든 c 파일들 지칭
OBJECTS = $(SRC:.c=.o) : SRC 의 .o 들
>> 명령어: make