시스템 프로그래밍

C언어 소스파일에서 실행 파일까지

kidmillionaire1998 2023. 3. 15. 00:32

학부 수업 시간에 C언어를 배웠고, 리눅스 환경에서 컴파일하는 명령어나, 방법도 안 배운 건 아닌데, 언제부턴가 습관적으로 
gcc -o a a.c 나 ./a와 같은 명령어만 사실 무슨 작업을 하는 지도 까먹어 간채 무의식적으로 썼던 것 같다. 
(과제는 c언어 코딩하는데 소스코드 작성하고 컴파일해서 시행해서 잘 실행만 되기만 하면 되니까..)
 
이번 글에선 우리가 작성한 c언어 소스파일(.c)이 어떤 과정을 거쳐 컴파일되어 실행파일로 우리 눈 앞에서 실행되는지 다뤄보고자 한다. 
 

c언어의 toolchain

 
전체적인 흐름을 나타내는 사진이다. 우리에게 익숙한 .c 소스 파일, c컴파일러, .o 오브젝트 파일도 여럿 보인다. 
과정은 크게 4가지로 나누어서 설명할 것이고, 해당 단계까지 실행할 수 있는 gcc 명령어를 옵션과 함께 설명할 것이다. 
 

1. 전처리기 동작 (.c => .i) 

가장 먼저 동작하는 건 전처리기이다. 소스파일인 .c 파일에 gcc를 동작시키면, 우리에게 매우 익숙한

#include <stdio.h>

와 같은 헤더 파일을 cpp라는 전처리기가 처리한다. 헤더파일에 포함되어있는 내용을 삽입하여, .i 확장자 파일이 생성된다. 
 
cf) cpp는 c/c++ preprocessor의 준말인 전처리기이다. 
 

명령어

#main.i 생성 
cpp main.c main.i
#main.i 생성 
gcc -E main.c -o main.i

 

2. 컴파일 단계 ( .i => .s) 

컴파일러러를 통해, 전처리된 파일 .i 파일로부터 어셈블리어로 되어있는 .s파일이 만들어진다. 
해당 단계도 컴파일 단계이고, 위 그림과 같이 전체적인 c tool chain 과정 전체도 컴파일이라고 하는데, 보통 전자를 작은 컴파일, 후자를 큰 컴파일이라고 한다. 
 

명령어

#main.s 생성 
gcc -S main.c

 

3. 어셈블 단계 (.s => .o)

어셈블리어로 되어있는 .s파일이 기계어로 된 오브젝트 파일인 .o 파일로 변환하게 된다. 

#file.o 생성 
gcc -c file.c

-c 옵션을 실행하게 되면 오브젝트 파일인 .o파일이 생성된다. 아래에 나올 다음 과정인 링킹(Linking) 단계를 수행하지 않아, 만들어지는 파일은 오브젝트 파일이다. 
 

4. 링커 단계 (.o => .exe) 

링크 과정

이러한 오브젝트 파일을 링크 하여 실행 가능한 파일로 만들어주는데, 링커는 실행 파일을 실행시키기 위해 필요한 라이브러리 함수들을 포함하여 실행 가능한 파일을 만든다. 
 
명령어는 아무 옵션 없이 gcc를 입력해 오브젝트 파일을 a.out이라는 실행 파일이 만들어지게 하는 경우와, 
-o 옵션을 써 실행 가능한 파일의 이름을 지정하는 경우가 있다. 

#a.out이 생성 
gcc file.o

#file이 생성 
gcc file.o -o file

 

그래서 gcc -o는..? 

우리가 많이 쓰는 gcc -o 명령어는 

#file 생성
gcc -o file file.c

.c 소스파일을 컴파일 + 링커 과정을 거쳐 실행 파일을 만들어주는 명령어이며, 이러한 파일의 이름도 직접 지정해줄 수 있는 것이다.  
 
 
 
https://jhnyang.tistory.com/40

[OS]링킹(Linking)이란? 링커(Linker)란? 컴파일 과정,목적파일, 빌드과정

운영체제 목차 메모리 관리를 시작하기 앞서 메모리 관리와 관련된 몇 가지 단어들이 나오는데 이런 단어들을 이해를 못하고 있으면 안됩니다. Linking에 대해서는 프로그램 컴파일에 대해서 배

jhnyang.tistory.com

https://seamless.tistory.com/2

gcc로 컴파일 하는 방법

1. gcc 동작 과정 gcc 란? 원래는 GNU C Compiler를 의미 했지만 1999년부터 GNU Compiler Collection을 의미한다. gcc가 실행시키는 프로그램 전처리기 : cpp 컴파일러 : cc1 어셈블러 : as 링커 : ld 단계별 처리 방

seamless.tistory.com

https://velog.io/@yoopark/c-preprocessor

[C] C언어 컴파일 1/4단계: 전처리기(Preprocessor)

cpp는 전처리 기능을 수행해주는 프로그램, 즉 전처리기다. 이해를 돕기 위해, 생성된 main.i 파일을 보여주자면 다음과 같다. 헤더를 \`main.c의 함수 sum 선언 부분만 떼어 sum.h라는 별도의 헤더 파일

velog.io