컴파일 과정
소스코드는 다음과 같은 과정으로 컴파일되어 실행파일이 된다.
- 전처리기(preprocessor): 소스코드의 주석제거, define을 치환하는 기능
- 컴파일러(compiler): 어셈블리 파일로 변환(어셈블리어는 CPU 명령어 조합으로 CPU에 의존적)
- 어셈블러(assembler): object 코드 파일로 변환. object 파일은 0과 1로 이루어진 바이너리 코드(아직 주소 정보가 확정되지 않음)
- 링커(linker): object 파일을 묶어 실행 코드 파일로 변환. 운영체제가 로딩할 수 있도록 주소 정보를 할당한 파일을 만들어 낸다.(링커는 운영체제에 의존적)
GCC 명령어
명령창에서 gcc 매뉴얼을 확인해보자.
GCC(1) GNU GCC(1)
NAME
gcc - GNU project C and C++ compiler
SYNOPSIS
gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-Wpedantic]
[-Idir...] [-Ldir...]
[-Dmacro[=defn]...] [-Umacro]
[-foption...] [-mmachine-option...]
[-o outfile] [@file] infile...
Only the most useful options are listed here; see below for
the remainder. g++ accepts mostly the same options as gcc.
...
// ex_gcc1.c
#include <stdio.h>
int main()
{
printf("Hello Linux\n");
return 0;
}
- 옵션을 사용하지 않고 gcc 명령을 내리면 컴파일 후에 링킹 과정을 거쳐 a.out 결과물이 만들어진다.
- 결과물 이름을 지을 땐 gcc -o [output] [file.c]를 사용한다.
- -c 옵션을 사용하면 컴파일을 수행하지 않고 확장자가 o인 목적파일을 만들어 준다. 실행이 가능하려면 링킹과정을 거쳐야 실행파일이 만들어진다.
자주 사용하는 GCC 옵션
--help : 간단한 옵션을 출력
--version 또는 -v : gcc의 버젼을 출력
-o : 출력 파일명을 지정
-c : 링킹 과정을 진행 하지 않고 .o 파일인 오브젝트 파일까지만 생성
-S : 어셈블러까지 진행 하지 않고, 컴파일러까지의 출력인 .S 어셈블러 파일을 생성
-E : 컴파일러까지 진행 하지 않고, 전처리까지의 출력인 .i 파일을 생성
-O1 ~ -O3 : 최적화 수준을 지정. 숫자가 클수록 높은 수준의 최적화.
-g : 디버깅을 위한 정보를 컴파일 하면서 생성
-D : define 을 할수 있는 옵션
-l (엘) : 라이브러리 이름을 지정
-L : 추가 라이브러리 디렉토리를 지정
-W : 모든 에러 메시지 출력
-w : 모든 에러 메시지를 출력 하지 않음
-I(아이) : 추가 헤더 파일이 있는 디렉토리를 지정
References
'System Programming' 카테고리의 다른 글
[C/CPU-affinity] 프로세스 CPU Affinity 설정 (0) | 2024.11.13 |
---|---|
BPF 를 통한 Linux Performance 분석 #1 BPF Program 구성요소 (3) | 2024.10.09 |