본문 바로가기
IT

리눅스 gcc 컴파일러 컴파일 옵션

by 미니송 2018. 2. 19.


이번 포스팅은 리눅스 gcc 컴파일러 컴파일 옵션에 대해 하겠습니다.

리눅스 컴파일러에 대한 설명을 했습니다.


다음은 컴파일러 옵션에 대해 설명하도록 하겠습니다.

거의 사용하는 옵션은 정해져 있지만 그래도 어떠한 옵션이 있는지 알아보도록 하겠습니다.


2018/02/12 - [IT] - 리눅스 gcc 컴파일러란?

2018/02/14 - [IT] - 리눅스 gcc 컴파일러 컴파일


 

[gcc 컴파일]


#gcc 파일명(*.c) : Default out 파일이 생성됩니다. (*.out 이라는 파일이 생성되며 실행 가능)

#gcc -c 파일명(*.c) : 오브젝트 파일을 생성합니다. (*.o라는 오브젝트 파일이 생성됩니다.)

 

#gcc -c 오브젝트파일명(*.o) 파일명(*.c)

#gcc -o 실행파일명(*.out) 오브젝트_파일명(*.o)

 

#gcc -o 실행파일 파일명(*.c) : 실행 파일을 만듭니다.

(소스 파일 컴파일오브젝트 파일 생성실행파일 생성오브젝트 파일 삭제)

 

 

[gcc 옵션]


1. -Wall 옵션 : 모든 모호한 코딩에 대해서 경고를 보내는 옵션

2. -W 옵션 : 합법적이지만 모호한 코딩에 대해서 경고를 보내는 옵션

3. -W -Wall 옵션 : 아주 사소한 모호성에 대해서도 경고가 발생

4. O2 옵션 : 최적화 레벨 2로 설정. (대부분의 최적화를 시도)

5. -E 옵션 : 전처리 과정의 결과를 화면에 보이는 옵션 (전처리과정 중 발생한 오류를 검증)

6. -S 옵션 : cc1으로 전처리된 파일을 어셈블리 파일로 컴파일까지만 수행하고 멈춥니다. (*.s)

7. -c 옵션 : as에 의한 어셈블까지만 수행하고 링크는 수행하지 않습니다.

8. -v 옵션 : gcc가 컴파일을 어떤 식으로 수행하는지를 화면에 출력합니다.

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

 


[cpp0 옵션]


소스내에서 사용된 헤더 파일과 define 매크로와 관련된 옵션들입니다. 전처리 과정에서 오류가 발생한다면 cpp0 옵션들을 점검해야 합니다.

1) -l 옵션 : 전처리 과정에서 헤더 파일을 탐색하는 기본 디렉토리를 추가할 때 사용하는 옵션

2) -include 옵션 : 헤더 파일을 소스내에 추가할 때 사용합니다.

3) -D[매크로] 옵션 : 매크로를 외부에서 define 할 때 사용합니다.

4) -D[매크로]=[매크로 값] 옵션 : 소스 내에 #define [매크로] [매크로 값] 옵션을 추가한 것과 동일합니다.

5) -U[매크로] 옵션 : -D와 반대로 소스 파일 내에 #undef[매크로] 옵션을 추가한 것과 동일합니다.

6) -M / -MM 옵션

M 옵션 - make를 위한 소스 파일의 모든 종속 항목을 출력

MM 옵션 - 기본 include 디렉토리에 있는 헤더 파일은 빼고 종속 항목을 출력합니다.

7) -nostdinc 옵션 : 디폴트 include 디렉토리(usr/include)에서 헤더 파일을 탐색하지 않고,

                           -l 옵션으로 추가한 디렉토리에서만 헤더 파일을 찾습니다.

8) -C 옵션 : -E 옵션과 함께 사용하며, 전처리 과정에서 주석을 제거하지 않습니다.

9) -Wp,[옵션들] 옵션 : 만약 cpp0 gcc의 옵션이 같은 것으로 중복되면 gcc 옵션으로 해석되므로  gcc의 해석을 거치지 않고 바로 cpp0 옵션으로 전달하고 싶을 때 사용합니다.

 

 

[cc1 옵션]


C언어 옵션, 경고 옵션, 최적화 옵션, 디버깅 옵션 4가지 종류

경고 수위 조절 or 최적화 수위 조절을 하고 싶을 때 사용하면 됩니다.


 1. C언어 옵션 : C언어 종류와 표준에 관련된 옵션

   1) -ansi 옵션 : ANSI C 표준에 부합하는 소스를 작성하고자 할 때 사용하는 옵션

   2) -std=[C 표준들] 옵션 : 기타 다른 표준들을 지정하고자 할 때 사용합니다.

   3) -traditional 옵션 : 오래된 Traditional C 문법으로 문법을 검사합니다.

   4) -fno -asm 옵션 : gnu89 문법을 바탕으로 asm, inline, typeof 키워드를 사용하지 않기를 원할 때 사용합니다.

 

2. 경고 옵션 : cc1의 옵션을 조정하여 경고 수위를 조절할 수 있습니다.

   1) -W / -Wall 옵션 (gcc 옵션 참고)

   2) -w(소문자) 옵션 : 모든 경고 메시지를 제거합니다.

   3) -Werror 옵션 : 모든 경고를 컴파일을 중단하는 오류로 취급합니다.

                           (경고가 하나만 나와도 컴파일이 중단된다.)

   4) -pedantic 옵션 : ANSI C89 표준에서 요구하는 모든 경고 메시지를 표시합니다.

   5) -pedantic-errors 옵션 : ANSI C89 표준에서 요구하는 모든 오류 메시지를 표시합니다.

   6) -Wtraditional 옵션 : 소스가 ANSI C K&R C 간에 서로 다른 결과를 가져올 수 있는 부분이 있다면 경고합니다.


3. 최적화 옵션 : ⓐ 실행 파일의 크기를 줄여 메모리와 하드디스크의 사이즈를 절약합니다.

                      실행 파일의 크기를 줄여 실행 속도를 향상시키는 것입니다.


   1) -O0 옵션 : 최적화를 수행하지 않습니다.

   2) -O1 옵션 : -O0보다는 조금 낫습니다.

   3) -O2 옵션 : 가장 많이 사용하는 옵션입니. 일반 응용 프로그램이나 커널을 컴파일 할 때 사용합니다.

                      (거의 대부분의 최적화를 수행한다.)

   4) -O3 옵션 : 가장 높은 레벨의 최적화를 사용합니다. 모든 함수를 인라인 함수와 같이 취급합니다.

                          너무나 많은 소스의 변경이 가해지기 때문에 왜곡이 발생할 위험이 있습니다.

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

 

4. 디버깅 옵션

   1) -g 옵션 : gdb에게 제공하는 정보를 바이너리에 삽입합니다.

   2) -pg 옵션 : 프로파일을 위한 코드를 삽입한다.

 


-Wa,[as의 옵션]

gcc as의 옵션에 대해서는 알지 못합니다. -Wa,[as 옵션들] 형식으로 gcc를 거치지 않고 바로 전달해야 합니다.

-Wa, -al, -as와 같은 형식으로 사용하면 as에게 -al -as 옵션이 같이 전해집니다.

 

1) -al 옵션 : 어셈블된 인스트럭션을 보입니다.

2) -as 옵션 : 정의된 심볼을 보입니다.

3) -l[패스] 옵션 : include 디렉토리를 지정합니다. 어셈블리 소스 내에서 사용된 include 지정자가 지정하는 헤더파일을 찾고자 할 때 사용합니다.

4) -W / --no-warn : 경고 메시지를 출력하지 않습니다.

5) -march=[아키텍처 문자열] : 해당 어셈블리

 


[collect2 / ld 옵션]


링크 옵션

1) -L[라이브러리 디렉토리] 옵션 : 라이브러리를 찾을 디렉토리를 지정합니다.

2) -l 옵션 : 같이 링크할 라이브러리를 지정합니다.

3) -shared 옵션 : 공유 라이브러리와 정적 라이브러리가 같이 있을 경우, 공유 라이브러리를 우선하여 링크합니다. (아무 옵션을 주지 않아도 공유 라이브러리를 우선으로 링크합니다.)

4) -static 옵션 : 정적 라이브러리와 공유 라이브러리가 같이 있다면, 정적 라이브러리를 우선하여 링크합니다.

5) -nostdlib 옵션 : 링크시에 표준 C 라이브러리를 사용하지 않습니다.

 (OS, 부트로더와 같은 프로그램을 컴파일 할 때 사용)

6) -nostartfiles 옵션 : crt1.o 등과 같은 start up 파일을 링크하지 않습니다.

 (OS, 부트로더와 같은 프로그램을 컴파일 할 때 사용)

7) -Wl,[링크 옵션들] 옵션 : gcc를 거치지 않고 바로 링크에게 옵션을 정해주고자 할 때 사용합니다.

 


[유용한 링크 옵션들]


 ① -s 옵션 : 실행 파일에서 심볼 테이블을 제거

 ② -x 옵션 : 출력 파일에서 로컬 심볼 제거

 ③ -n 옵션 : 텍스트 영역을 읽기 전용으로 만듬

 ④ -r 옵션 : 추후 링크가 가능하게 오브젝트를 만듬

 ⑤ -e [name] 옵션 :  시작 심볼을 name 심볼로 사용 (default 시작심볼 : _start 심볼)

 ⑥ -M 옵션 : 심볼들의 정보를 자세하게 출력

 ⑦ oformat [format] 옵션 : 주어진 형식의 오브젝트 파일을 생성


댓글