본문 바로가기

System/Linux

GCC]gcc compile option

출처 : http://www.dreampharos.com/


[gcc 컴파일]

1) gcc 파일명(*.c) : Default로 out 파일이 생성된다. (ex a.out)
2) gcc -c 파일명(*.c) : 오브젝트 파일을 생성한다.
3) gcc -c 오브젝트_파일명(*.o) 파일명(*.c)
    gcc -o 실행파일명(*.out) 오브젝트_파일명(*.o)
 

4) gcc -o 실행파일 파일명(*.c) : 실행 파일을 만든다. (3번을 한줄로...)

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

 

===================================================================================================

 [gcc 옵션]

1. -Wall 옵션 : 모든 모호한 코딩에 대해서 경고를 보내는 옵션
2. -W 옵션 : 합법적이지만 모호한 코딩에 대해서 경고를 보내는 옵션
3. -W -Wall 옵션 : 아주 사소한 모호성에 대해서도 경고가 발생
4. O2 옵션 : 최적화 레벨 2로 설정. (대부분의 최적화를 시도)
5. -E 옵션 : 전처리 과정의 결과를 화면에 보이는 옵션 (전처리과정 중 발생한 오류를 검증)
                 ※ enhanced Tip: --save-temps 옵션 
 

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. 최적화 옵션 : ⓐ 실행 파일의 크기를 줄여 메모리와 하드디스크의 사이즈를 절약 (큰 의미 X)
                         ⓑ 실행 파일의 크기를 줄여 실행 속도를 향상시키는 것.

    1) -O0 옵션 : 최적화를 수행하지 않는다.
   2) -O1 옵션 : -O0보다는 조금 낫다. 
   3) -O2 옵션 : 가장 많이 사용하는 옵션. 일반 응용 프로그램이나 커널을 컴파일 할 때 사용
                      (거의 대부분의 최적화를 수행한다.)

   4) -O3 옵션 : 가장 높은 레벨의 최적화. 모든 함수를 인라인 함수와 같이 취급한다.               
                      (Call 인스트럭션은 사용 X. but, 되도록이면 사용하지 않는 것이 좋다. 
                          → 너무나 많은 소스의 변경이 가해지기 때문에 왜곡이 발생할 위험이 있다.)

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

 

 4. 디버깅 옵션
   1) -g 옵션 : gdb에게 제공하는 정보를 바이너리에 삽입한다.
                (-g 옵션을 사용하지 않고 gdb로 디버깅하면, 역어셈 → 어셈블리 코드로만 디버깅 가능)

   2) -pg 옵션 : 프로파일을 위한 코드를 삽입한다. 
                 (-pg 옵션으로 컴파일 → gmon.out(프로파일 정보) → gprof로 gmon.out 파일 분석)

===================================================================================================

[as의 옵션]
: gcc는 as의 옵션에 대해서는 알지 못한다. -Wa,[as 옵션들] 형식으로 gcc를 거치지 않고 
  바로 전달해야 한다. -Wa, -al, -as와 같은 형식으로 사용하면 as에게 -al -as 옵션이 같이 전해진다.

 -Wa,[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를 거치지 않고 바로 링크에게 옵션을 정해주고자 할 때 사용한다.
                                      (사용법은 -Wa와 동일한다.)
   
   < 유용한 링크 옵션들 >
   ① -s 옵션 : 실행 파일에서 심볼 테이블을 제거
   ② -x 옵션 : 출력 파일에서 로컬 심볼 제거
   ③ -n 옵션 : 텍스트 영역을 읽기 전용으로 만듬
   ④ -r 옵션 : 추후 링크가 가능하게 오브젝트를 만듬
   ⑤ -e [name] 옵션 :  시작 심볼을 name 심볼로 사용 (default 시작심볼 : _start 심볼)
   ⑥ -M 옵션 : 심볼들의 정보를 자세하게 출력
   ⑦ oformat [format] 옵션 : 주어진 형식의 오브젝트 파일을 생성

=============================================================================================================

'System > Linux' 카테고리의 다른 글

리눅스의 종류와 선택  (1) 2016.07.15
samba 설치  (0) 2016.05.11
리눅스에서 명령어로 IP 등록하기 (ifconfig)  (0) 2016.04.27
ARM 크로스 컴파일 환경 구축하기  (0) 2016.04.22
C/C++ library 만들기  (0) 2016.04.22