GCC

sameul__choi·2021년 11월 11일
1

C / Linux

목록 보기
1/1

GCC GNU Compiler Collection, 자유 소프트웨어 중에 가장 잘 알려진 GCC는 원래 C만을 지원했던 컴파일러로 GNU C Compiler 였지만, 현재는 C++, Java, 포트란, 에이다 등 여러 언어를 컴파일할 수 있게 되면서, 현재의 이름으로 바뀌었다.

GCC가 실행시키는 프로그램

  • cpp 전처리기
  • cc1 컴파일러
  • as 어셈블러
  • id 링커

1) 전처리 단계

소스 파일(file.c)에 gcc를 동작시키면 가장 먼저 전처리기인 cpp가 동작한다. cpp는 소스 파일의 #include와 #define과 같은 #으로 시작되는 전처리기 부분을 처리 한다. 즉, 필요한 헤더 파일을 삽입하고 실행 문장의 매크로를 상수로 변환한다. 소스 파일 file.c가 전처리기를 거치면 file.i라는 이름의 파일이 생성되지만 디스크에는 저장되지 않는다.

2) 컴파일 단계

컴파일러가 전처리된 파일(file.i)로부터 어셈블리어로 된 파일(file.s)을 생성한다. 그런데 일반적으로 다음 단계인 어셈블 단계를 바로 실행하므로 file.s 파일은 디스크에 저장되지 않는다.

3) 어셈블 단계

hello.s의 내용을 더욱 쪼개서 instruction 단위로 만들고 이것을 한데모아 재배치가능한 목적프로그램(relocatable object program) 의 단위로 묶어 .o 파일을 만든다. 각각의 object 파일은 번역단위(translation unit)를 바탕으로 작성이 되는데, 번역단위란, 컴파일를 통해 하나의 목적파일을 만드는 바탕이 되는 소스코드를 말하며, 전처리기를 거친(# 지시자등이 모두 처리된) 하나의 c 파일이라고 생각할 수 있다. 또한 재배치 가능하다는 의미는 링커를 통해 다른 목적파일들과 결합이 가능하다는것을 의미한다. 이러한 특성으로, 프로그램 소스코드의 일부가 변경되었을 때 전체 소스에 대한 컴파일을 새로 수행하는 것 대신, 해당 목적파일만 생성하고 교체하면 되기때문에 컴파일의 효율성이 높아진다. 이 단계부터는 사람이 읽을 수 없는 내용으로 파일이 만들어진다. (binary 파일)

4) 링크 단계

오브젝트 파일(file.o)은 printf, scanf와 같은 라이브러리 함수에 해당하는 코드가 없기 때문에 실행될 수 없다. 또한 여러 파일로 이루어진 프로그램의 경우에도 파일 간에 연결이 이루어지지 않아 실행될 수 없는데, 이러한 라이브러리 함수와 오브젝트파일들을 연결해 실행 파일을 생성하는 단계가 링크 단계이다.
그리고 컴파일을 할 때는 각 단계별로 옵션을 사용해 얼마나 진행되었는지 그 상황을 볼 수 있게 수동으로 제어할 수 있는데, gcc 옵션을 사용한다.

5) 파일 확장자에 따른 처리 방법

gcc는 파일 확장자에 따라 다음과 같이 처리 방법을 달리하는데, 한 가지만 설명하면 확장자가 .c인 경우 gcc로 전처리기, 컴파일, 어셈블, 링크 과정을 거쳐야 실행 파일이 완성된다는 것이다.

2. GCC 실행하기

gcc 소스파일 이름

gcc로 컴파일에 성공하면 a.out이라는 파이링 생성된 것을 확인할 수 있다. 여기서 그냥 명령어로 a.out를 입력하면 명령어를 발견할 수 없다는 오류가 나온다. 이는 a.out이 저장된 디렉토리를 path로 설정하지 않았기 때문인데, path로 설정되지 않는 디렉토리에 있는 명령어는 디렉토리 위치를 지정해주지 않는 한 실행되지 않는다.

./a.out

즉, 프로그램 이름 앞에 디렉토리 위치정보를 추가해야 명령어가 실행된다.
./ -> 현재 디렉토리를 의미.

3. GCC 옵션

0개의 댓글