제일 처음 .c 파일을 작성하여 생성한다. 이 소스파일이 컴파일되는 과정을 살펴보자
.c파일은 .i 파일로 가는 전처리기 과정을 거친다.
이 과정은 헤더파일 삽입과 매크로 치환 및 적용 과정을 거친다.
두 번째로는 C 컴파일러 과정을 거쳐서 .i 파일이 .asm파일로 간다.
여기서는 중간언어를 생성하는 것인데 이유는 언어 종속적인 부분과 기계 종속적인 부분을 분리하여
컴파일러를 모듈화 하고 최적화하기 위해서이다.
세 번째로는 어셈블러를 이용하여 .asm파일이 .o 파일로 바뀐다.
.o파일은 .s의 기계어와 데이터가 들어있는 ELF바이너리 포맷의 구조를 가진다.
여기서 ELF(Executable and linking format)이란 실행 및 링크가 가능한 포맷이다. ( exe파일과 비슷)
ELF이 필요한 이유는 우리가 링커라면 링크해야 할 여러 object파일들이 일정한 규칙을 가지고 있지 않고 제멋대로 되어 있다면
이를 하나의 실행파일로 만들기가 힘들 것이다.
즉 바이너리 파일 구조를 알아야만 어디서 어디까지가 기계어이고 어디서 어디까지가 데이터인지 알 수 있다.
또한 어떻게든 실행 파일로 만들었다고 해도 이를 실행하기 위해 실행파일을 메모리에 어떻게 어느 부분을 실행시켜야 할지 알 수가 없다.
그렇기 때문에 실행파일을 실행할때 링커나 로더에게 정보를 제공해야만 링크하고 로드하고 실행할 수 있다.
물론 그러기 위해서 바이너리 파일이 일정한 규칙을 가지는 구조로 되어있어야 하고 바이너리 스스로 정보를 제공할 수 있어야 가능하다.
실제로 object file의 제일 처음에는 ELF헤더가 붙는다. 이 헤더에는 바이너리 특징을 결정짓는 엔디안,운영체제,cpu의 정보와 함께 바이너리 내부의 각 구역 시작 위치와 크기 정보가 들어 있다.
'Study' 카테고리의 다른 글
OPTEE pc레지스터 & secure storage(수정중) (0) | 2021.07.26 |
---|---|
OPTEE Systemcall Hash연산 (0) | 2021.07.25 |
OPTEE system call 실습 (0) | 2021.07.24 |
ARM TrustZone 메커니즘 (2) | 2021.07.22 |
ARMv8 (0) | 2021.07.22 |