[리눅스] gcc를 통한 c컴파일

d·2023년 3월 30일
0
post-thumbnail

컴파일 과정

전처리(Pre-Processing) -> 컴파일(Compilation) -> 어셈블(Assembly) -> 링크(Linking)


1) 전처리

전처리기(Preprocessor) 로 컴파일 전에 코드를 적정한 상태로 준비하는 과정이다.
#include <stdio.h>과 같은 전처리기 구문으로 필요한 헤더파일을 불러오거나, 기호 상수(symbolic constant,특정 상수에 변수처럼 이름을 부여한 것)를 정의해서 코드상으로 필요한 내용을 먼저 채워준다.
.c 파일이 전처리 단계를 거쳐서 .i파일(전처리 된 c파일)이 된다.

2) 컴파일

컴파일러(Compiler) 가 고수준 언어를 저수준 언어로 나타내는 과정이다. 소스 프로그램을 목적(object) 프로그램으로 변환하고 개발자가 c언어로 작성한 소스코드를 어셈블리어로 바꿔준다.
.i파일이 컴파일 단계를 거쳐서 .s 파일(어셈블러 파일)이 된다.

3) 어셈블

어셈블러(Assembler) 가 어셈블리어를 기계어로 바꿔주는 과정이다. '명령어'와 '데이터'가 들어있는 'ELF 바이너리 포맷' 구조를 가진 오브젝트 파일이 생성된다. (gcc는 as라는 어셈블러를 사용한다.)

4) 링크

링커(Linker) 가 바이너리 파일들을 서로 연결시키고, 만약 (static)libraries(.a)가 있으면 libraries도 연결시킨다. 이 때 목적 프로그램을 라이브러리와 연결하여 실행 프로그램(exe)를 작성한다.


GCC 명령어

gcc -v

현재 사용하는 gcc의 버전을 나타내는 옵션이다. 소프트웨어 패키지를 컴파일 하고자 할 때 어느 버전 이상의 gcc를 쓰도록 권장하는 경우가 있기 때문에 gcc의 버전을 알고자 할 때 사용한다. 컴파일러 버전정보, include 디렉토리, 어셈블러 정보, 실행파일 형식 등의 정보를 확인 할 수 있다.

gcc -o

실행파일의 이름을 지정하는 옵션이다. -o 옵션이 없으면 output file 이름은 a.out이 된다.
ex) gcc -o <실행파일이름> <소스파일이름> 또는 gcc <소스파일이름> -o <실행파일이름>

gcc -c

전처리, 컴파일, 어셈블까지 실행하여 오브젝트파일을 생성할 때 사용하는 옵션이다. 즉, test.c 파일을 -c 옵션을 사용해 컴파일 하면 test.o 라는 오브젝트 파일이 생성된다.

gcc -I

헤더파일을 탐색할 디렉토리 지정 옵션이다. C 소스가 표준 디렉토리가 아닌 위치에 있는 헤더파일을 가질 때 그 디렉토리 위치를 지정해준다.
ex) gcc test.c -Imydir

gcc -l

표준 라이브러리가 아닌 라이브러리를 사용하고자 할 때 그 탐색할 라이브러리에 원하는 디렉토리를 추가해준다.

gcc -g

OS의 native format (stabs, COFF, XCOFF, DWARF)으로 디버깅 정보를 생성한다.
-g 옵션에는 실행파일에 삽입될 디버깅 정보의 양에 따라 -g, -g2, -g3와 같이 세가지 단계가 있는데, 숫자 없이 -g 옵션을 주면 기본적으로 -g2의 디버깅 정보가 삽입된다.
g1 : 역추적 스택 덤프 생성에 필요한 정보를 포함하지만 지역변수, 문장 번호를 위한 디버깅 정보는 삽입하지 않는다.
g2 : 확장 기호 테이블, 문장 번호, 지역과 외부 변수에 대한 디버깅 정보를 삽입한다.
g3 : g2옵션의 디버깅 정보와 모든 매크로 정의를 삽입한다.

gcc -O (Optimize)

-O 옵션도 -g옵션과 마찬가지로 단계가 있는데, 이 단계는 gcc버전마다 차이가 나며 값이 커질수록 더욱 최적화된 코드가 나온다. 일반적으로, -O1, -O2를 많이 사용하며, -O1, -O2, -O3에 의한 최적화 내용은 다음과 같다.
-O1 : -O옵션과 같은 단계의 옵션으로 최소한의 스레드 분기 동작 횟수를 줄이고, 호출된 각 함수 반환 시 스택에 인수를 모아 두었다 동시에 꺼내게 해 준다.
-O2 : -O1 단계의 최적화와 함께 프로세서가 다른 명령어의 결과나 캐시 메모리 또는 메모리의 데이터를 기다리는 동안 컴파일러가 다른 명령어를 실행하도록 한다. 컴파일 시간이 더 오래 걸리지만, 수정된 코드는 더 최적화되어 실행이 빨라진다.
-O3 : -O2단계의 모든 최적화와 루프 해체, 그 밖의 프로세서 전용 특징을 포함한다.
-Os : -O2단계의 최적화 중 코드의 크기를 증가시키는 것 말고 모든것을 활성화하고, 코드의 사이즈를 최적화한다.

0개의 댓글