Linux

리눅스) gcc 명령어

manchesterandthecity 2020. 11. 20. 21:33

gcc는 C와 C++ 컴파일러이다. 이는 컴파일 뿐만 아니라 전처리, 컴파일, 어셈블리, 링킹의 과정을 모두 진행할 수 있으며, 옵션을 이용하여 그 중간과정만을 이행할 수도 있다.

사용 방식은 다음과 같다.

gcc [option] [filename]

이때, filename은 컴파일의 대상이 되는 파일명이지, 컴파일의 결과에 해당하는 파일의 이름이 아님을 명심한다.

<option>

옵션의 경우 사용 목적에 따라 여러가지로 분류된다.

**옵션을 겹쳐쓰지 않는다! 두 글자 이상의 옵션도 존재하므로 모든 옵션을 따로따로 사용하는 것이 좋다!**

<Overall option>

* -c : 컴파일과 어셈블은 하되, 링킹은 하지 않는다. (각 파일의 오브젝트 파일이 결과물이 된다.)

* -S : 컴파일은 하되, 어셈블은 하지 않는다. (어셈블러 코드가 결과물이 된다.)

* -E : 전처리만 한다. (전처리가 필요없는 파일은 이 옵션을 무시한다.)

* -o [file] : [file]의 이름을 가진 파일로 출력한다. (확장자에 상관 없이 출력하며, 하지 않을 시 자동으로 [filename].out형태로 출력한다.)

* -x [language] : 특별히 파일의 확장자명을 명시한다. (이후 파일들에 한꺼번에 적용이 가능하다.)

* -x : 확장자 명시를 해제한다.

* -v : vervose의 약자로 컴파일 과정 보고, 컴파일러 드라이버, 전처리기 버전 출력을 한다.

* -pass-exit-codes : 프로그램의 비정상 종료시 1이 아닌 4를 출력한다.

* -pipe : 프로그램을 동시에 실행한다. (임시로 몇 단계 프로그램 만들지 말고 이걸 쓰면 된다.)

* -static : 정적 링크 라이브러리를 사용하도록 한다.(공유 라이브러리를 사용하지 않는다.)

* --save-temps : 컴파일 과정에서 생성되는 중간 파일인 전처리 파일(*.i)과 어셈블리 파일(*.s)을 지우지 않고, 현재 디렉토리에 저장한다. (오류 분석에 사용된다.)

* -fPIC : so파일의 속도 개선을 위한 옵션이다.

* -shared : so파일을 컴파일하기 위한 옵션이다.

* -fno-stack-protector : SSP를 끈다.

* -fstack-protector-all : SSP를 모든 함수에 설치한다.(SSP는 로컬변수 재배치, 로컬변수 전에 포인터 설치, canary 삽입을 담당한다.)

* -m32 : 32비트로 프로그램을 만든다.

* -m64 : 64비트로 프로그램을 만든다.

* -no-pie : 메모리 보호기법인 PIE를 사용하지 않는다.

* -fpie –pie : PIE를 사용한다. --enable-default-pie 와 같은 기능을 한다.

* -mpreferred-stack-boundary(=[number]) : main함수에 스택을 정렬하는 이상한 인스트럭션을 제거한다.

* -z relro : RELRO (Relocation Read-Only) 를 적용한다.

* -z execstack : DEP (Data Execution Prevention)을 실행한다.

* -z stack-protector : CANARY를 사용한다.

* -z stack-boundary : 스택 더미를 활성화한다.

<Warning option>

코딩의 모호함에 대해 경고를 보내는 정도에 대한 옵션이다.

* -Wall : 모든 모호한 코딩에 대해서 경고를 보낸다.

* -W : 합법적이지만 모호한 코딩에 대해서 경고를 보낸다.

* -w : 모든 경고메시지를 제거한다.

* -Werror : 모든 경고를 컴파일을 중단하는 오류로 취급한다.

<Optimization option>

프로그램의 최적화를 얼마만큼 할 지를 명시하는 옵션이다.

*-O0 : 최적화를 수행하지 않는다.

*-O1 : 조금 최적화한다.

*-O2 : 가장 많이 사용하는 최적화이다. 일반 응용프로그램이나 커널을 컴파일할 때 사용한다.(거의 대부분의 최적화를 수행한다.)

*-O3 : 가장 높은 레벨의 최적화이다. 모든 함수를 인라인 함수와 같이 취급한다.(왜곡 발생 가능성이 높다.)

*-O5 : 사이즈 최적화를 실행한다. (임베디드 시스템에서 사용한다.)

<Debugging option>

디버깅 용도를 위해 추가하는 옵션이다.

*-g : gdb에게 제공하는 정보를 바이너리에 삽입한다.

*-pg : 프로파일을 위한 코드 삽입을 담당한다.

 

다음은 확장자명 별 의미이다. 리눅스는 윈도우와 달리 확장자명이 프로그램의 실행에 영향을 미치지 않는다. 따라서 리눅스에서는 사용자의 참고용으로서 의미를 가진다.

<확장자명>

*[file].c : C 소스코드 (전처리가 필요하다.)

*[file].i : 전처리 금지 C 소스코드

*[file].cc, [file].cp, [file].cxx, [file].cpp, [file].c++, [file].C : C++ 소스코드 (전처리가 필요하다.)

*[file].ii : 전처리 금지 C++ 소스코드

*[file].h : 헤더파일

*[file].s : 어셈블리 코드

 

 

 

출처 : 

blog.naver.com/apple8718/222038588396