-
[SW 정글 33일차] gcc 알아보기기타/SW 사관학교 정글 2021. 9. 4. 02:33
어제는 가상 소프트웨어를 처음 접하면서 가상화에 대해 공부했는데 오늘은 내가 짠 C언어 코드를 컴파일하기 위한 도구인 gcc라는 컴파일러에 대해 공부해보려고 한다.
1. GCC (GNU Compiler Collection)란?
GCC는 GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 컴파일러 중 하나이다.
GNU 프로젝트에 대해 간단히 말하면 GNU's Not UNIX의 줄임말로 유닉스와 호환될수 잇도록 만들어진 일종의 operating system으로 open source software이다.
GCC는 초기에 C언어만을 지원했던 컴파일러였지만 현재는 C++, Objective-C, Fortran, Ada, Go 등 다양한 언어에서 쓰일 수 있는 컴파일러이다.
2. GCC의 컴파일 과정
컴파일 과정은 크게 4가지로 구분된다.
GCC가 위에 간략하게 표시한 그림의 모든 과정을 직접 수행하는 것이 아니라 다른 프로그램과 함께 컴파일을 진행한다.
1) 전처리 단계
우리가 만든 .c 소스파일 안에 쓴 # 문자로 시작하는 지시자들에 대한 처리를 한다.
ex) #include, #ifndefine ...
소스파일에 #include stdio.h라는 코드가 있다면 stdio.h 헤더파일을 읽어와서 우리가 만든 소스파일에 삽입시킨다.
전처리 단계가 완료된 파일은 .c에서 .i로 바뀌어 저장된다.
전처리 단계에서는 cpp 프로그램을 사용한다.
2) 컴파일 단계
전처리 단계를 마치고 나온 .i 파일을 읽어와 어셈블리 언어로 변환하여 .s 파일로 저장하는 단계이다.
어셈블리 언어는 기계어(컴퓨터가 이해할 수 있는 언어)와 일대일 대응이 되는 저급 언어로 컴퓨터 구조에 따라 사용하는 기계어가 다르며 이에 따라 어셈블리어도 각각 다르다.
컴파일 단계에서는 cc1 프로그램을 사용한다.
3) 어셈블리 단계
컴파일 단계를 끝내고 나온 .s 파일에 담긴 내용을 더욱 쪼개서 instruction 단위로 만들고 이것을 모아서 재배치가능한 목적프로그램의 단위로 묶어 .o 파일을 만드는 작업이 이루어진다.
각각의 object file은 translation unit을 바탕으로 작성이 되는데 여기서 translation unit은 컴파일을 통해 하나의 목적파일을 만드는 바탕이 되는 소스코드를 말한다.
이러한 특성으로 프로그램 소스코드의 일부가 변경되었을 떄 전체 소스에 대한 컴파일을 새로 수행하는 것이 아닌 해당 목적파일만 생성하고 교체하는 것이 가능해져 효율성이 높아진다.
어셈블리 단계에서는 as 프로그램을 사용한다.
4) 링킹 단계
컴파일 과정의 마지막 단계로 여러 목적파일들, 우리가 짠 코드의 목적파일 뿐만 아니라 그 안에서 여러 외부 라이브러리 참조를 통해 쓰여진 함수들에 대한 목적파일을 결합시켜 프로그램이 정상적으로 동작하게 해주는 단계이다.
링킹 단계가 완료되어 나온 파일은 실행파일이 되고 배포할 수 있다.
링킹 단계에서는 Id 프로그램을 사용한다.
3. 간단한 GCC 명령어 접해보기
gcc test.c
간단하게 위와 같이 써주면 컴파일 후에 링킹 과정을 거쳐 a.out 결과물이 만들어져 실행파일이 나온다.
gcc -o test test.c
위와 같이 -o와 함께 원하는 결과물의 파일명이 있다면 기재해주면 된다.
그러면 결과물로 써준 이름으로 실행파일이 만들어진다.
gcc -c test.c
위 명령어는 소스파일을 어셈블리 단계까지 수행하여 확장자가 o인 목적 파일을 만들어준다.
실행파일으로 만들기 위해서는 링킹 과정을 거쳐야한다.
gcc -o test test1.c test2.c
컴파일은 하나의 파일이 아닌 여러 파일들을 열거하여 해당 파일들을 컴파일 할 수 있다.
ar rscv libdemo.a test.o
ar 명령어를 사용하면 목적 파일을 라이브러리로 만들 수 있다.
만들려고 하는 라이브러리 이름은 lib로 시작하게 작성해야한다.
gcc -o test test1.c -L./ -ldemo
작성한 라이브러리를 포함하여 컴파일 할 때는 -l 옵션을 주는데 라이브러리 파일 이름은 lib와 .a를 빼주고 써준다.
그리고 라이브러리 파일이 있는 경로를 -L 옵션으로 표시한다.
gcc -shared -fPIC -o libshare.so test.o
직접 만든 라이브러리가 아닌 공유 라이브러리과 함께 컴파일 할 때에는 -shared -fPIC -o 옵션을 사용한다.
[오늘의 나는 어땠을까?]
오늘은 정글에 들어오고 나서 가장 많이 졸은 것같다.
그냥 잠과의 싸움을 했다.
점심을 먹고 낮잠을 30분 정도 자고 왔지만 그래도 잠이 쏟아졌고 어떻게든 정신을 붙잡고 집중하려고 했지만 쉽지 않았다.
그래서 저녁을 먹기 까지는 내가 뭐했지라는 생각이 들었고 너무 한심했다.
저녁을 먹을 후에는 같은 팀 동료가 포인터에 대한 질문을 던져줬고 전혀 모르겠어서 다시 마음을 잡고 포인터 개념 처음부터 공부를 했다.
어느 정도 공부를 하고 동료에게 찾아가서 해결이 됐는지 물어보고 동료가 이해한 내용을 나에게 알려주면서 정말 많은 것을 새롭게 알게 되었다.
오늘도 동료에게 고마움을 느끼며 성장을 했다.
내일부터는 정말 정신을 차리고 몰입해야한다.
일단은 Red-Black Tree를 완성시키는 것에 매달리기보다는 그 과정에서 알아갈 수 있는 것들을 최대한 많이 알아가려고 한다.
<참고 자료>
https://ko.wikipedia.org/wiki/GNU_%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC_%EB%AA%A8%EC%9D%8C
'기타 > SW 사관학교 정글' 카테고리의 다른 글
[SW 정글 35일차] 동적 메모리 할당 (링크드리스트, 이진탐색트리) (0) 2021.09.06 [SW 정글 34일차] 알수록 신기한 C언어 (0) 2021.09.05 [SW 정글 32일차] 가상화를 맛보다 (2) 2021.09.03 SW 정글 4주차 회고 (1) 2021.09.02 [SW 정글 31일차] 오늘은 C 포인터 (0) 2021.09.02