본문 바로가기
책/혼공 컴퓨터구조+운영체제

컴퓨터 구조 - C언어 컴파일 과정(전처리, 컴파일, 어셈블러,링커) +) 목적파일, 실행파일

by 코딩하는 돼징 2023. 11. 12.
반응형

C언어 컴파일 과정

 


1. 전처리기

C 언어에서 전처리기는 소스 코드를 컴파일하기 전에 특정한 변환 및 처리 작업을 수행하는 도구이다. 전처리기 명령은 # 기호로 시작하며 주로 소스 코드의 특정 부분을 조건부 컴파일하거나 매크로로 대체하는 등의 작업을 수행한다.

01 헤더 파일 포함(#include)

외부에서 선언된 헤더 파일을 현재 소스코드에 포함시킨다. 이를 통해 다양한 라이브러리나 다른 소스 코드 파일에서 선언된 내용을 현재 파일에서 사용할 수 있다.

#include <stdio.h>

02 매크로 정의(#define)

매크로는 코드 중복을 방지하고 가독성을 향상시키기 위해 사용된다.

#define PI 3.14159

03 조건부 컴파일 (#if, #ifdef, ...)

조건부 컴파일 지시문은 컴파일 영역을 지정하거나 조건에 따라 코드를 포함시키거나 제외할 때 사용된다. 

 

DEBUG 매크로 코드 예시

DEBUG매크로가 정의 되어 있으면 디버그 로그를 출력하는 LOG매크로를 정의하고 그렇지 않으면 LOG매크로를 빈 문자열로 정의하고 있다.

#ifdef DEBUG
#define LOG(message) printf("Debug: %s\n", message)
#else
#define LOG(message)
#endif

 

2. 컴파일러

컴파일 과정(compiling)에서 전처리된 소스 코드를 어셈블리 언어로 변환한다. 

 

 

 "Hello, World!" 컴파일 결과 예시

section .data
    hello db 'Hello, World!',0

section .text
    global _start

_start:
    ; write 'Hello, World!' to stdout
    mov eax, 4            ; system call number (sys_write)
    mov ebx, 1            ; file descriptor (stdout)
    mov ecx, hello        ; pointer to the string
    mov edx, 13           ; length of the string
    int 0x80              ; interrupt to invoke system call

    ; exit the program
    mov eax, 1            ; system call number (sys_exit)
    xor ebx, ebx          ; exit code 0
    int 0x80              ; interrupt to invoke system call

3. 어셈블러

어셈블 과정(assembling)과정에서 어셈블리 언어로 작성된 목적 코드를 기계어로 변환한다. 그 결과로 목적코드를 생성한다.

 

 "Hello, World!" 어셈블링 결과 예시

00000000: b801000000        mov eax, 1
00000005: bb01000000        mov ebx, 1
0000000a: b904000000        mov ecx, 4
0000000f: ba00000000        mov edx, 0
00000014: cd80              int 0x80
00000016: b801000000        mov eax, 1
0000001b: bb00000000        mov ebx, 0
00000020: cd80              int 0x80

목적 파일 vs 실행 파일

목적 파일(Object File)

어셈블러는 목적 코드를 포함하는 목적파일을 생성한다. 목적 파일은 여러 목적 코드 섹션과 각 섹션의 정보를 포함하고 있다. 일반적으로 바이너리 형식으로 저장된다. 이는 링커에 의해 여러 목적 파일이 결합되어 하나의 실행파일이 생성되기 전까지 완전한 프로그램이 아니다.

실행 파일(Executable File)

링킹이 완료된 후에 생성되며, 프로그램이 실제로 실행될 수 있는 형태이다. 링킹은 여러 목적 파일 하나로 결합하고, 주소를 조종하며, 외부라이브러리와의 연결을 수행하는 등의 작업을 수행한다. 컴퓨터의 운영체제에 의해 직접 실행 가능한 형태로 해석되어 프로그램이 메모리에 로드되고 실행한다.


4. 링커

링킹(Linking)은 각기 다른 목적 코드를 하나의 실행 파일로 묶는 즉 연결 시켜주는 작업이다. 결과적으로 실행 파일이 된다.

 

 

 

 

 

 

참고 :  본 내용은개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제강의를 수강하여 작성하였습니다.

https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

 

 

 

 

 

반응형

댓글