임베디드 소프트웨어 컴파일러에 대해 설명하도록 하겠다.
SW 공부를 하다보면 컴파일, 오브젝트 파일, 어셈 파일 등등을 들어 보았을 것이다.
1. 컴파일이란
컴파일이란 쉽게 변환을 의미 한다.
우리가 흔히 쓰는 언어(C, C++, C#, Java...)는 컴퓨터가 알아 들을수 없다. 마치 내가 프랑스어를 알아 듣지 못하듯...
따라서 컴퓨터가 알아 들을수 있는 언어로 변환이 필요하다. 즉 컴퓨터가 인식 할수 있도록 기계지향적 언어로 변환하는 방법을 컴파일이라고 한다.
컴파일 : 변환 (인간 언어 -> 컴퓨터 언어)
컴파일러 : 변환기 ( 번역기 같은... )
이 컴파일러에 의해 생성되는 기계어 명령문을 오브젝트 코드(object code)라고 하며,
object code가 포함 되어 있는 파일을 오브젝트 파일(object file : .obj ) 이라고 부른다.
소스 코드가 담겨 있는 소프 파일을 컴파일 하게 되면 오브젝트 파일이 생성 되고, 컴파일을 수행한 경로의 파일 목록을 보면, 소스 파일과 동일한 이름을 가지지만
소프코드의 확장자( *.c or *.py or *.cpp) 등이 아닌 .obj라는 확장자를 확인 할수 있다.
.obj의 확장자를 가지는 파일은 오브젝트 파일이며 링커(Linker)에 의해 사용 된다.
(Unix 시스템의 경우 컴파일러는 .obj가 아니라 .o의 확장자를 가지는 오브젝트 파일을 생성함)
2. 컴파일 단계
C언어에서 사용자가 제작한 source 파일을 실행 파일(.exe)로 만드는데 1) preprocess, 2) compile, 3)Link 이 세 과정을 거친다.
1) source 파일(*.c) --(preprocess)--> 전처리된 파일(*.i) 생성
2) 전처리된 파일(*.i) --(Compile)--> 어셈블리어(*.a, *.asm) 생성 (중간 파일)
3) 어셈블리어(*.a, *.asm) --(assambly)--> 오브젝트파일(*.o, *.obj) 생성
4) 오브젝트파일(*.o, *.obj) --(Link)--> 실행파일(.exe) 생성
3. 전처리(Preprocess) 란?
소스파일 내부에 있는 전처리 명령을 수행
전처리 명령은 source파일 내부 #으로 시작되는 명령어들이다. ex) #include, #define, #ifdef ...
이 명령어들은 전처리기(preprocessor)가 처리한다.
전처리 명령어는 주로 소스 파일을 컴파일 하기 전에 수행 되며 어떤형태로 커파일 할지 결정하거나 소스코드를 최적화 하는 등의 역할을 수행함
3.1 전처리된 파일(*.i)
전처리 과정을 거치면서 생성된 소스명.i 라는 임시 파일은 컴파일에 사용된 후 자동으로 삭제 되어 디스크에 남지 않는다.
4. 컴파일(Compile) 란?
앞서 이야기 한것처럼 전처리된 소스파일을 컴파일러를 이용해 기계어로 변환하는 과정이다.
변환하는 과정에서 c문법에 맞지 않거나 표준을 따르지 않으면.... ! 컴파일 에러나 경고를 발생시키고 아무런 문제가 없이 과정을 마치게 되면 기게어로 변환된 *.obj 파일을 생성함
4.1 어샘블리어 파일 (*.asm)
어셈블리언어는 기계어의 2진 코드를 영문으로 알아보기 쉽게 고쳐 놓은 것이다.
즉 인간이 이해할수 있는 컴퓨터 언어의 최하단이며 C언어의 부모와 같은 언어이다.
범용 언어인 C언어나 C++로만 작성된 SW는 최적화 되지 않아 최대 성능을 이끌기에는 무리가 있다.
따라서 최적화가 필요한 경우 어셈블리어가 사용 된다. 또는 임베디드 보드의 레지스터를 직접 건드리기 위해 사용됨
어셈블리어로 작성된 소스파일은 어셈블러를 통해 실행 코드로 변환 가능 하다.
asm 파일은 컴파일 과정 중 생성되어 obj 파일을 만들고 이 파일은 다시 링커(link)에 의해 실행 가능한 파일로 변환된다.
4.2 오브젝트 파일(*.obj)
오브젝트 파일은 컴파일러나 어셈블러가 소스코드 파일을 처리하는 도중 만들어 내는 코드의 대표이다.
오브젝트 파일은 2진 파일 이라고 불리는 밀집된 코드를 포함하고 있다. 링커는 오브젝트 파일을 함께 묶음으로써 보통 실행 파일이나 라이브러리를 만들어내는데에 쓰임
오브젝트 파일에서 유일하게 필수적인 요소는 기계어가 있다.
임베딛드 시스템을 위한 오브젝트 파일 들은 기계어 말곤 아무것도 포함하고 있지 않음
그러나 오브젝트 파일들은 또한 연결, 디버그 목적으로나 다른 디버그 정보를 위해 런타임, 릴로케이션 정보, 프로그램 심볼의 코드로 사용하기 위한 데이터를 포함하기도 한다