임베디드/임베디드 레시피

2장 이어서

twoweeks-within 2025. 1. 25. 18:22

1. .Preprocessor (.i) .c -> .s -> .o -> .elf -> bin

 

 #ifdef :: 2중 define 막기위함

 

2. sta tic ::  C++ : protect

     > 자기 함수, .c파일내에서만 global

          > exturn 불가

 

3. Volatile : 같은 주소에 값을 연달아 넣을때 최적화방지

 

4. symbol : 자신만의 주소를 갖는 단위 :: global 

<>    local : 자신만의 주소 X 

 

5. const : ReadOnly : 값 따로 못줌

   ex) const int i;  > i 는 쓰레기값으로 평생 살아야함

                   i=3; >> X 컴파일에러 

 

6.

 

RO, RW : read / write 

   > ROM 에 저장 > 값 유지

ZI : zero initialize :: 어짜피 0이니깐 유지필요 X  > RAM

 

 

Malloc :: 동적메모리 > heap 

local :: stack :: pc가 함

 

7. ELF format Object File

 

Linking View :: link 하기전의 .o file ( relocatable file )

Execution View :: link 후 실행가능한 ,elf file (executable file)

/*

#define EI_NIDENT 16

typedef struct {
unsigned char e_ident[EI_NIDENT];
 Elf32_Half e_type;

// 32_Half :: 16bit (2byte)

 

-e_type :

ET_REL 1 Relocatable file 

*/

.o file Header,, size 52

00000000h: 7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 ; ELF............ 

// e_ident : 16 :: char :: 1 index > 1byte

00000010h: 01 00 28 00 01 00 00 00 00 00 00 00 00 00 00 00 ; ..(.............

>

1byte + 1byte = 2byte

01 00 :: Little endian > 00 01 :: 1 

 

GCC bin utility -> readelf 에서 쉽게 볼 수 있음

 

8. compile 후의  기계여 (op code) 확인법

 

.o file > disassemble :: fromelf -c spaghetti.o

 

.o file Source,, disassemble

main
$t
.text
0x00000000: 2003 . MOV r0,#3  

 > 2003 :: code 영역 > little endian > 0320

 

>> 이 .o Header 52 byte 이후에 있나 보면,,

 

00000030h: 0B 00 01 00 03 20 04 21 40 18 10 18 70 47 00 00 ; ..... .!@...pG..

 

9. symbol table

 

symbol table

Name : Linker를 위한 symbol 이름,

Value: 각 section에서의 해당 symbol의 시작 offset 주소

// offset :: 변위차 ex) 100 + 9 = 109  > offset : +9

Size : Symbol의 크기 (Symbol이 function이나 object가 아닌 경우에는 0),

Type : Function, Object, Section 등을 나타내며,

Bind: Symbol의 scope를 한정 (Local, Global, Weak) .

(Ndx)

UND : 현재 file에서 사용되고 있지만, 실제 함수의 define이 없는 경우,

ABS : relocate 되어서는 안 되는 것

Ndx= 1 > text section

Ndx=3  > data

WEAK : LOCAL로만 쓰일 가능성이 큰 symbol

 

0: 00000000 0 NOTYPE LOCAL DEFAULT UND
17: 00000000 10 FUNC GLOBAL DEFAULT 5 main

main:: FUNC ( 메인함수 라고 하죠)

        > GLOBAL ( 함수니깐 global)

14: 00000000 4 OBJECT GLOBAL DEFAULT 6 zi
15: 00000000 4 OBJECT GLOBAL DEFAULT 7 rw

>  zi, rw 역시 GLOBAL

 

링커가 이 table 을 이용하여 서로를 link 해

 

 

 

 

 

 

 

코드들 : .text

초기화 된 전역변수 : .data

초기화 되지 않은 전역 변수들 : .bss 

'임베디드 > 임베디드 레시피' 카테고리의 다른 글

4장 ,안한부분 끝 // 완  (0) 2025.01.28
2장 이어서 ~ 3장까지 (완)  (0) 2025.01.26
2장 정리  (0) 2025.01.24
1장 이어서  (0) 2025.01.22
1장 정리안된부분  (0) 2025.01.20