본문 바로가기

임베디드 리눅스

c언어 컴파일 과정

728x90
반응형

 

안녕하세요. 매일이 새롭고 싶은 WH 입니다.

컴파일

' 기계어로 번역해주는 과정 '

참 간단합니다.

컴파일 과정은 반드시 알고 있어야하는 과정입니다.

왜냐고요? 파일간의 관계를 파악해야하거든요.

 

가장 유명한 hello.c를 가지고 그 과정을 낱낱히 분석해봅시다.

hello.c 파일

#include <stdio.h>

int main(int argc, char **argv)
{
	printf("Hello World\n");
    return 0 ;
}

들어가기 앞서 정리하고 들어가겠습니다.

코딩 -> hello.c -> preprocessing( 전처리 ) -> hello.i -> compile ( assemble 코드 생성 ) -> hello.s

-> assemble ( 목적 파일 생성 )-> hello.o  -> hello.o + lib ( link ) ( 링크 ) -> hello 실행 파일 탄생

 

c 프로그램 실행 과정

 

1. 전처리 (preprocessing )

전처리는 말그대로 무엇을 처리하기 전에 처리한다는 말입니다. 도대체 무엇이 무엇이고 뭘 처리한다는 걸까요?

소스코드 hello.c 파일에서 주석 부분을 제거하고 #으로 시작하는 부분에 대해서 C 컴파일러가 알기 쉽도록 바꿔줍니다.

즉, #include는 헤더파일의 내용을 읽고 필요한 부분을 복사해두고 매크로 치환과 같은 과정을 겪게 됩니다. 이 과정에서 컴파일러는 내부적으로 hello.i라는 파일을 생성합니다. i파일은 전처리기 완료된 파일을 의미합니다

 

2. Assmbler 코드 생성

전처리가 끝난 소스코드 즉 hello.i를 기반으로 어셈플러 소스 코드를 생성하는데요, 컴파일러의 중요한 목적은 어셈블러 코드를 생성하는 것이며, 어셈블러는 CPU 제조사에 맞게 작성되요. 어셈블러는 표준 문법이 다양해 문법 체계가 여러가지인데 참고로 LINUX의 GNU 기반은 기본적으로 GAS( GNU assembler)를 사용합니다.

 

3. object 파일 생성

위에서 생성된 hello.s를 바탕으로 목적파일( hello.o )이 생성되는데 object 파일은 기계어 코드입니다.

 

4. 실행파일 생성

object 파일은 직접 실행할 수 없는 파일인데요, 이를 실행 파일로 만들기 위해서는 link작업을 하게도비니다. 무엇을 연결한다는 것일까요? 바로 object 파일 들을 하나로 합쳐서 실행파일을 만드는 것을 의미합니다. 하나 정리하고 가자면, 링커(linker)는 이 링크 작업을 해주는 프로그램이며, object를 모아서 실행파일을 만드는 작업을 link라 합니다. 다시 돌아가서 실행 파일은 hello.o와 표준 라이브러리 .a 또는 .so 파일이 합쳐져 만들어지게 되는 것이죠

 

https://jangpd007.tistory.com/220 gcc와 관련하여 좋은 글이 있어 남겨놓을게요. 이번 글은 여기까지이며, 해당 글에서 컴파일 과정을 이해하기 좋은 옵션은 -E -V  정도 참고하시면 도움이 될것 같습니다. 중간 파일들을 보고 싶다면, --save-temps 옵션을 활용해도 좋을것 같네요. 읽어주셔서 감사합니다.

728x90
반응형