메뉴
brunch
매거진
그 외 개발 관련
실행
신고
라이킷
11
댓글
공유
닫기
You can make anything
by writing
C.S.Lewis
브런치스토리 시작하기
브런치스토리 홈
브런치스토리 나우
브런치스토리 책방
계정을 잊어버리셨나요?
by
서준수
Apr 07. 2019
C언어 빌드 과정 (build process)
with gcc
프로그래밍을 처음 시작하면 만나는 첫 예제는 hello world 출력이 아닐까 싶다.
그런데 이 쉬운 예제, 빌드 과정은 어떻게 될까?
#include <stdio.h>
int main() {
printf("hello world!");
return 0;
}
일단 hello world 예제를 빌드해 보자. 빌드 환경은 윈도우에서 MinGW-W64와 Git Bash를 설치하여 gcc를 사용할 것이다. 해당 환경 구축은
여기
를 참고하면 된다.
1. 일단 빌드해 보기
일단 gcc로 빌드를 해보자. 먼저 앞의 예제 코드를 포함한 hello.c 파일을 만든다.
Git Bash shell에서 만드는 방법은 vi hello.c를 입력하고 코드를 복사해서 붙여 넣는다. 그 후 Esc를 누르고 x 또는 wq!를 입력하고 엔터키를 누르면 된다. 다른 방법으로는 그냥 메모장 등에서 만들어서 현재 경로에 넣어주면 된다.
빌드를 하는 방법은 다음과 같다.
gcc hello.c
또는
gcc hello.c -o hello
첫 번째는 실행 파일명을 따로 지정해 준 것이 아니라서 a.exe라는 실행파일이 만들어진다. 두 번째는 hello.exe라는 실행파일이 만들어진다. 두 번째 방법(gcc 소스파일 -o 실행파일명)으로 빌드를 해보자.
빌드 후 ls 명령어로 확인해 보면 hello.exe가 만들어진 것을 볼 수 있다. 실행은 ./hello.exe 라고 입력하면 된다. 그러면 정상적으로 hello world!가 출력되는 것을 확인할 수 있다.
단 한 줄의 명령어로 실행파일이 뚝딱 만들어졌다. 하지만 실제로는 아래와 같은 과정을 거쳐서 만들어진다.
빌드 과정
빌드 과정은 여러 중간 단계를 거친다. gcc 명령어에 옵션을 추가하여 각 단계별로 결과를 확인할 수 있다.
컴파일러인 gcc는 다음과 같이 각 단계에 적합한 툴을 호출한다.
전처리 (Preprocess) : cpp
컴파일 (Compile) :
c
c
1
어셈블 (Assemble) : as
링크 (Link) : ld
2. 전처리 (Preprocess)
전처리는 다음 부분에 해당한다.
전처리 단계
헤더파일을 포함하고 매크로 확장을 하는 단계이다. 매크로 확장은 매크로 생성이라고도 한다. 즉 다음과 같은 구문을 처리하는 것이다.
#include <stdio.h> // 헤더 파일
#define MAX_NUM = 100 // 매크로
gcc는 cpp라는 전처리기를 사용한다. 전처리 단계까지만 진행하는 방법은 다음과 같다.
gcc -E hello.c -o hello.i
이때 결과물은 포함된 헤더파일에 정의된 변수와 함수를 포함하는 hello.i이다.
3. 컴파일 (Compile)
컴파일은 다음 부분에 해당한다.
컴파일 단계
컴파일 단계에서 C언어 코드가 cc
1
에
의해
어셈블리어로 변환된다.
이 단계까지만 진행하려면 다음과 같은 옵션을 사용하면 된다.
gcc -S hello.c
이때 결과물은 어셈블리어 형태의 데이터와 코드를 포함하고 있는 hello.s이다.
4. 어셈블 (Assemble)
어셈블은 다음 부분에 해당한다.
어셈블 단계
어셈블 단계에서는 C코드를 컴파일하고 그것을 모은다. gcc는 as라는 어셈블러를 사용한다.
이 단계까지 진행하기 위해서는 다음과 같은 옵션을 사용한다.
gcc -c hello.c
결과는 각 소스에 대한 binary 파일(=object 파일)인 hello.o이다. binary 파일은 데이터와 기계어를 포함한다.
5. 링크 (Link)
링크는 다음 부분에 해당한다.
링크 단계
링크 단계에서 binary 파일들이 서로 연결되고, 만약 (Static) libraries (.a)가 있으면 libraries도 연결된다.
이 단계를 진행하는 방법은 다음과 같다.
gcc hello.c -o hello
결과물은 코드와 데이터를 포함하는 실행 가능한 바이너리 파일(실행파일)인 hello.exe이다.
keyword
프로그래밍
컴파일
실행파일
브런치는 최신 브라우저에 최적화 되어있습니다.
IE
chrome
safari