본문 바로가기

임베디드(embedded)/BSP(Board Support Package) 학습

컴파일(Compile)

컴파일(Compile)이란 간단하게 프로그래머가 작성한 소스를 컴퓨터가 이해할 수 있는 기계어나 어셈블리어로 변환해주는 과정을 말합니다.

 

간단하게 Compile이 진행되는 과정은 아래 [ 그림 1 ]과 같습니다.

 




[ 그림 1 ]

 

그림을 설명하면 단계는 아래와 같습니다.

 

1.    전처리기(Preprocessor)에 의한 전처리 과정

2.    컴파일러(Compiler)를 통한 어셈블리어로 변환 과정

3.    어셈블러(Assembler)를 통해 오브젝트 파일 생성

4.    링커(Linker)를 통한 Linking(심볼 해석, 재배치 등) 과정

 

프로그래머가 작성하는 소스 파일은 ‘.c’ 파일입니다. 그리고 가장 처음으로 전처리기(Preprocessor)를 통해 전처리 과정을 거칩니다. 전처리 과정이란 소스파일에 다른 파일의 텍스트를 포함시키거나 일부 문장을 다른 문장으로 바꾸는 작업(치환) 등을 수행합니다. 전처리 명령어는 ‘#’ 기호로 시작합니다. 전처리 과정이 끝나면 ‘.i’ 파일이 생성이 됩니다.

 

컴파일러(Compiler)는 하드웨어에 종속적인 어셈블리코드인 ‘.s’를 생성합니다.

 

어셈블러(Assembler)는 어셈블리어로 오브젝트 파일인 ‘.o’를 생성합니다.

 

링커(Linker)는 링킹(Linking) 과정을 거쳐 하나의 실행 파일을 만들어 줍니다.

링킹(Linking)이란 여러가지 코드와 데이터를 묶어 메모리로 로드될 수 있는 하나의 실행 가능한 파일을 만드는 작업으로 재배치(Relocation)과 심볼해석(Symbol Resolution)이 있습니다.

 

-      재배치(Relocation) : 프로그램의 각기 다른 부분들(코드와 데이터)에 대해 로드되는 주소를 할당하는 것 입니다. 이러한 작업은 같은 타입(코드 혹은 데이터)으로 정의된 모든 구간들을 하나의 구간으로 합치고, 이러한 구간들이 런-타임 때 올바른 주소를 가리킬 수 있도록 조정하는 것을 말합니다.

 

-      심볼해석(Symbol Resolution) : 하나의 상위 프로그램이 다른 하위 프로그램을 참조하는 것은 심볼이라는 것을 통해 이루어지는데, 이러한 심볼의 위치를 알아내어 상위 프로그램의 오브젝트 코드에 하위 프로그램의 주소를 기입하여 참조를 해석하도록 하는 것입니다.