본문 바로가기

C

컴파일

반응형

[컴파일]

 

- 소스 코드 .c 파일을 실행 파일로 변환시켜주는 작업

 

컴파일 과정에선 크게 4가지 변환기를 통해 실행 파일로 변환된다.

 

전처리기 -> 컴파일러 -> 어셈블러 -> 링커

 

 

전처리기(preprocessing) -> .c 파일을 .i 파일로 전처리해주는 변환기

전처리(preprocess) - 본격적으로 컴파일하기 전에 처리할 작업들로 외부에 선언된 다양한 소스코드, 라이브러리(헤더 파일 등)를 포함시키고, 프로그래밍의 편의를 위해 작성된 매크로(define 으로 설정된 상수값 등) 변환과 컴파일할 영역(ifdef 류의 구문)을 명시해준다.

 

다음과 같은 구문으로 .i 파일을 생성시킬 수 있다.

소스 코드 = test.c

(gcc -E test.c -o test.i)

 

생성된 파일을 읽어보면 헤더 파일등의 코드등이 복사되어 메인 구문 위에 작성되어 있음을 확인할 수 있다.


컴파일러(compiler) -> .i 파일을 .s 파일로 컴파일해주는 변환기 (.c 파일도 변환가능)

컴파일(complie) - 전처리가 완료된 소스 코드를 컴퓨터가 이해할 수 있게 저급 언어(어셈블리 언어)로 변환시켜주는 작업

 

다음과 같은 구문으로 .s 파일을 생성시킬 수 있다.

소스코드 = test.i

(gcc -S test.i -o test.s)

 

생성된 파일을 읽어보면 어셈블리어로 변환되어 있는 파일임을 확인할 수 있다.


어셈블러(assembler) -> .s 파일을 .o (목적 파일)로 어셈블해주는 변환기

어셈블(assemble) -  어셈블리어로 작성된 파일을 기계어로 변환시켜주는 작업으로, 목적 코드(object file)를 포함하는 목적 파일이 된다.

 

다음과 같은 구문으로 .o 파일을 생성시킬 수 있다.

소스코드 = test.s

(gcc -o test.o test.s)

 

생성된 파일을 읽어보면 기계어로 변환되어 있어 사람이 읽기엔 매우 난해하게 되어있다.

해당 파일을 읽어 보고싶다면

 

xxd test.o  <= 구문을 입력하면 기계어를 읽을 수 있게 정리된 채로 볼 수 있다.


링킹(linking) -> .o 파일을 실행 파일로 링크해주는 변환기

링크(link) - 실행 파일로 생성하고자 한 파일에서 필요한 다른 목적파일이 된 여러 소스 파일들을 하나로 묶어주는 작업

 

다음과 같은 구문으로 실행 파일을 생성시킬 수 있다.

 

gcc test.c

 

생성 파일의 이름을 임의로 지정해주지 않으면 공통적으로 a.out 이라는 이름으로 실행 파일이 생성된다. 


링킹 작업까지 거치고서야 비로소 실행 파일이 생성된다.

위에서 사용한 해당 옵션들은 MakeFile 제작시에도 일부 사용하니 알아두는 것이 좋을 것 같다.

반응형

'C' 카테고리의 다른 글

스레드 동기화  (8) 2024.09.14
스레드2  (0) 2024.09.14