A.3.1 실행 파일 형식(Excutable and Linkable Fomat)
이번 절은 부록 A.2에서 나온 호출 방법 중 구체적인 실행 파일 형식에 대해 다룹니다.
실행 파일을 만드는 방법은 gcc가 오브젝트 파일을 만들고 링커가 라이브러리를 링킹하면 최종 결과물인 실행 파일이 생성됩니다. 운영체제가 게임 실행 파일(LOL.exe)을 실행하면 게임이 켜지는 거와 같습니다. 반면에 펌웨어 바이너리는 운영체제가 없어 사용자가 실행할 수 없지만 타깃 시스템에 전원이 들어오면 자동으로 켜지게 하는 파일 형식이므로 이것 또한 실행 파일(Excutable and Linkable Fomat)이라고 합니다.
ELF 파일 포맷의 시작은 ELF 헤더와 ELF 섹션으로 나누어 집니다.
- ELF 헤더 : ELF 포맷이 지정하는 여러 정보를 담고 있음, OS나 임베디드 시스템의 로더가 ELF 헤더를 읽은 후 필요한 데이터를 찾아 메모리에 복사해 CPU의 레지스터 값을 조정해 실행
- ELF 섹션 : .text, .rdata, .data, .bss, .syntab, .rel.text, .rel.data, .debug, .line, .strtab (섹션들은 .으로 시작합니다)
- .text : 컴파일러가 만든 기계어가 위치함, 역 어셈블시 어셈블리어 나옴
- .rdata : read only data, const 키워드나 상수 데이터가 위치함
- .bss : block started by simbol, 초기화 되지 않은 전역 변수 위치(나중에 0으로 초기화 예정 그리고 단순 크기 정보만 가지고 있음)
- .symtab : symbol table, 전역 변수와 함수에 대한 심벌 저장, 링커가 링킹 할 때 다른 바이너리 파일의 .rel.text, .rel.data에 있는 심벌 정보를 이용해 링크
- .rel.text, .rel.data : 다른 파일에 선언된 전역 변수나 함수 호출 시 당장 찾을 수 없으니 이 섹션에 심볼 저장 후 링커의 도움 받음
- .debug : gcc에서 -g 옵션을 주어야 debug 섹션 생성, 전역 변수나 함수 이름을 .symtab에서 읽어오고 로컬 변수는 이 섹션에서 읽음
- .line : 디버깅 시 c언어 한 줄이 어셈블리어 여러 줄로 연결 되어지는 정보 기록, 마찬가지로 gcc -g 옵션 필수
- .strtab : ELF 파일 전체에 사용되는 문자열 정보 기록, 문자열은 정적 데이터 이므로 기록된 값 그대로 사용
앞의 내용을 정리하자면 아래 그림과 같습니다
링커는 ELF 헤더와 섹션을 읽어 오브젝트 파일들을 하나로 묶은 다음에 최종 실행 가능한 바이너리 파일(ELF)을 만듭니다. 이후 운영체제의 로더에 의해 실행 파일이 조각으로 분해되어 메모리에 복사 됩니다. 반면에 임베디드 시스템 같은 경우에는 로더가 필요없게 하는 바이너리 파일을 만들거나 임베디드 시스템 별도의 로더를 만듭니다.
정리
1. 실행 파일(ELF)은 링커가 오브젝트 파일과 라이브러리를 링크해 만든다.
2. ELF 파일 포맷의 시작은 ELF 헤더와 ELF 섹션이다.
'OS > Embedded OS' 카테고리의 다른 글
부록 A.5 Makefile을 짜보자 (0) | 2021.08.24 |
---|---|
부록 A.4 gcc 사용법 (0) | 2021.08.24 |
부록 A.2 ABI (0) | 2021.08.24 |
부록 A.1 ARM 아키텍처 기초 지식 (0) | 2021.08.16 |
2장 개발 환경 구성하기 (0) | 2021.08.14 |