이번에는 exe의 확장자를 가지는 실행파일의 생성과정을 알아보겠습니다.
실행파일의 생성과정은 아래 그림과 같이 전처리기>컴파일러>어셈블러>링커의 순으로 만들어집니다.
먼저 전처리기에 의한 작업부터 알아보겠습니다.
전처리기에 의한 치환작업
실행파일 생성의 가장 첫 번째 단계가 전처리기에 의해서 이루어집니다. 전처리기는 #include, #define과 같이 #으로 시작하는 지시자의 지시에 따라서 소스코드를 적절히 변경하는 작업을 합니다.
컴파일러에 의한 번역
1단계에 의해서 변경된 소스코드는 여전히 C언어로 구성되어 있어서 우리가 눈으로 봐도 이해할 수 있는 내용입니다. 이제 이 소스코드는 컴파일러에 의해서 어셈블리 코드로 번역됩니다.
CPU가 디자인될 때 CPU에게 일을 시키기 위한 명령어도 함께 디자인되는데, 어셈블리 코드란 이러한 명령어를 조합해서 만들어진 프로그램 코드를 의미합니다. 만약 C와 같은 언어로 구현된 프로그램을 어셈블리 프로그램으로 변경해 주는 컴파일러가 없다며 이 명령어 체계를 익혀서 프로그램을 작성해야만 합니다.
어셈블러에 의한 바이너리 코드 생성
바이너리 코드는 텍스트 코드에 상대되는 뜻이라고 생각하면 쉽습니다. 1과 0으로만 구성되는 코드를 말합니다. 컴파일러에 의해 번역된 어셈블리 코드는 컴퓨터에 의해 실행되기에 앞서서 바이너리 코드로 번역되어야 합니다. 왜냐하면 컴퓨터는 오로지 1과 0만을 이해하기 때문입니다.
예를 들어 CPU를 디자인하는 개발자가 덧셈, 뺄셈, 곱셈 그리고 나눗셈 명령어 체계를
덧셈은 0011, 뺄셈은 0010, 곱셈은 0100, 나눗셈은 0101로 정한다 했을 떄, 이때부터 이 개발자가 디자인한 CPU에 0011이 들어가면 덧셈이 실행되고, 0010이 들어가면 뺄셈이 실행되기 시작합니다. 따라서 덧셈, 뺄셈, 곱셈, 나눗셈을 이어서 하려면 아래와 같은 순서로 명령어를 구성해야 합니다
0011 0010 0100 0101
이러한 명령어 체계를 가지고 프로그램을 구현한다는 것은 너무나도 불편한일입니다. 그래서 CPU개발자는 아래와 같은 표를 만들었습니다
ADD
|
0011
|
MIN
|
0010
|
MUL
|
0100
|
DIV
|
0101
|
위 표를 참조하여 다시 명령어를 구성할 때 ADD MIN MUL ADD MUL 와 같은 방식으로 프로그램을 구현할 수 있습니다.
이러한 방식의 프로그래밍이 어셈블리 프로그래밍입니다. 위의 테이블을 참조해서 어셈블리 코드를 다시 0011 0010 0100 0011 0100 의 식의 CPU가 이해할 수 있는 바이너리 코드로 바꾸어 주는 프로그램이 바로 어셈블러입니다.
! 여기서 잠깐 한가지 집고 넘어갈 점이 있는데, Visual studio를 통해 C++코드를 컴파일할 경우 obj의 확장자를 가진 파일들이 생성됩니다. 목적파일이라고도 불리우며 중간파일이라고도 합니다. 이렇게 생성된 목적파일을 링커라는 프로그램을 이용해서 연결하게 되는데, 목적파일이 무엇인지 위키에 나와있는 내용에 대해서 한번 읽어보신 후 이해하는것이 더 좋을듯합니다.
목적 코드 또는 목적 파일은 컴파일러나 어셈블러가 소스 코드 파일을 컴파일 또는 어셈블해서 생성하는 파일입니다. 목적 파일들은 기계어나 혹은 이에 준하는 RTL과 같은 이진 코드로 이루어져 있으며, 링커는 여러 개의 목적 파일을 묶어 커널과 연결함으로써 실행 파일을 만들거나, 혹은 라이브러리를 만들어내는 데에 쓰입니다. 목적 파일에서 필수적인 요소는 기계어(컴퓨터의 CPU가 직접 실행하는 코드)입니다. 목적 파일들은 또한 링크나 디버그를 위해 런타임 정보, 릴로케이션 정보, 프로그램 심볼의 코드로 사용하는 데이터를 포함하기도 한다.
<위키 : https://ko.wikipedia.org/wiki/%EB%AA%A9%EC%A0%81_%ED%8C%8C%EC%9D%BC>
이제 어셈블러에 의해 어셈블리코드가 바이너리 코드로 바뀌게 되면 링커에 의한 작업이 진행됩니다.
링커에 의한 연결과 결합
링커는 프로그램 내에서 참조하는 함수나 라이브러리들을 하나로 묶는 작업을 한다고 설명할 수 있습니다. 이 과정이 끝나면 실제로 실행 가능한 실행파일이 생성됩니다. 물론 이 실행파일은 컴퓨터가 실행해야 하는 바이너리 코드로 구성됩니다.
* 참고 사이트
http://www.ith.kr/chair/cpp/cpp103.html
* 참고 서적
뇌자극 윈도우즈 시스템 프로그래밍