----------------------------------------------------
기본 옵션
----------------------------------------------------
gcc -W -Wall -O2 -o test test.c
-Wall
모든 모호한 코딩에 대해서 경고를 보내는 옵션
-W
합법적이지만 모호한 코딩에 대해서 경고를 보내는 옵션
-W -Wall 아주 사소한 모호성에 대해서도 경고
-O2
최적화 레벨을 2로 설정 (거의 대부분의 최적화를 시도)
-o test
컴파일된 파일명을 test로 하라는 의미
----------------------------------------------------
gcc 옵션
----------------------------------------------------
gcc -E test.c
-E
전처리 과정의 결과를 화면에 보이는 옵션
전처리 과정 중에 발생한 오류를 검증할 때 사용하면 좋다.
※ 더 강력한 옵션: --save-temps
생성되는 test.i 파일을 읽어보는 것이 더 좋은 방법.
gcc -S test.c
-S
cc1으로 전처리된 파일을 어셈블리 파일로 컴파일까지만 수행하고 멈춘다.
test.s 파일이 만들어진다.
gcc -c test.c
-c
as에 의한 어셈블까지만 수행하고 링크는 하지 않음.
test.o 까지만 만들어진다.
gcc -v test.c
-v
컴파일 과정을 화면에 출력한다.
--save-temps
컴파일 과정에서 생성되는 중간 파일인 전처리 파일(*.i)과 어셈블리 파일(*.s)를 지우지 않고 현재 디렉토리에 저장한다.
컴파일 과정의 에러를 분석할 때 사용.
----------------------------------------------------
cpp0 옵션
----------------------------------------------------
-I (대문자 아이임)
전처리 과정에서 헤더파일을 탐색하는 기본 디렉토리를 추가할 때 사용하는 옵션
-include [헤더파일경로]
헤더파일을 소스 내에 추가할 때 사용
소스파일 내에서 #include 하는 것과 동일
-D[매크로]
-D[매크로]=[매크로값]
매크로를 외부에서 define
gcc -DDEBUG -o test test.c
-U [매크로]
-D와 반대로 소스파일 내에 #undef 옵션을 추가한 것과 동일
-M
make를 위한 소스 파일의 모든 종속항목을 출력
-MM
make를 위한 소스 파일에서 기본 include 디렉토리에 있는 헤더 파일은 빼고 종속 항목을 출력
-nostdinc
디폴트 include 디렉토리 (/usr/include) 에서 헤더 파일을 탐색하지 않고 -I 옵션으로 추가한 디렉토리에서만 헤더파일을 찾는다.
리눅스 커널과 같이 표준 C함수를 사요하지 않는 프로그램을 컴파일할 때 잘못된 include로 인해 오류가 발생하는 것을 방지한다.
-C
-E 옵션과 함께 사용하며 전처리 과정에서 주석을 제거하지 않는다. (사용빈도 낮음)
-Wp,[옵션들]
cpp0와 gcc 옵션이 같은 것으로 중복되면 gcc 옵션으로 해석된다.
gcc가 옵션을 해석해서 cpp0, cc1, as, collect2에게 옵션을 전달하기 때문.
gcc가 모든 컴파일러들의 주인이란다.
gcc의 해석을 거치지 않고 바로 cpp0의 옵션으로 전달하고 싶을 때 -Wp 옵션을 사용
예) -Wp,-DDEBUG,-I/usr/include,-M
=> cpp0로 -DDEBUG -I/usr/include -M 옵션이 바로 전달됨.
----------------------------------------------------
cc1 옵션
----------------------------------------------------
(1) C언어 옵션
-ansi
ANSI C 표준에 부합하는 소스를 작성하고자할 때 사용하는 옵션
ANSI C 표준(C89)으로 문법 체크를 하고 GNU C의 확장 문법은 사용 불가능
이식성 높은 코드를 작성하고자 한다면 이 옵션을 사용.
-ansi 옵션은 -pedantic 경고옵션과 주로 함께 사용. (ANSI C89 문법에 부합하지 않는 모든 경고 메시지 출력)
-std=[C 표준들]
기타 다른 표준들을 지정하고자할 때 사용
(i) c89 또는 iso9899:1990 => -ansi 옵션과 동일
(ii) c99 또는 iso9899:1999 => 1999년에 새로 제정된 ANSI C 표준, gcc 3.x 버전부터 사용가능 (C++ 문법 커버 가능)
(iii) gnu89 => GNU C89 표준으로 문법 체크, C99와 유사하나 완전 동일하지는 않다.
(iv) gnu99 => GNU C99 표준으로 문법 체크
-traditional
오래된 Traditional C (K&R C) 문법으로 체크, gcc 3.x 버전부터는 지원하지 않는다.
- fno -asm
gnu89 문법에서 지원하는 asm, inline, typeof 키워드를 사용하지 않는다.
gcc는 기본적으로 gnu89 문법으로 체크한다.
(asm은 C 소스 내에 어셈블리 코드를 삽입할 때, inline은 인라인 함수 지정할 때, typeof는 변수 타입을 알아볼 때 사용)
asm, inline, typeof 키워드는 ANSI C89 표준에서는 지원하지 않으므로 ANSI C89에서 지원하는 __asm__, __inline__, __typeof__ 를 사용해야 한다.
(2) 경고 옵션
-W
-Wall
아주 사소한 경고까지 표시
-Wno-[제거할 경고]
경고 메시지 제거
(-Wunused, -Wunused-function, -Wunused-label, -Wunused-parameter, -Wunused-value, -Wunused-variable, -Wwrite-strings, ...)
-w
모든 경고 메시지를 제거
-Werror
모든 경고를 컴파일을 중단하는 에러로 취급해서 경고 하나만 나와도 컴파일 중단.
-pedantic
ANSI C89 표준에서 요구하는 모든 경고 메시지를 표시
-pedantic-errors
ANSI C89 표준에서 요구하는 모든 에러 메시지를 표시
-Wtraditional
소스가 ANSI C와 K&R C 간에 서로 다른 결과를 가져올 수 있는 부분이 있다면 경고 표시
(3) 최적화 옵션
◇ 목적
- 실행 파일의 크기를 줄여 메모리와 하드디스크 사이즈 절약
- 실행 속도 향상
◇ 주의사항
- 속도 최적화와 사이즈 최적화의 상호 영향을 적절히 고려
- 인터럽트를 이용해서 레지스터 값을 바꾸거나 장치에 직접 값을 써야하는 경우에는 사용하지 않는 것이 좋다.
◇ 효과
- 불필요한 함수 호출 제거
- 상수의 전달과 변수 복제 전달의 최적화
- 불필요한 루프 제거
- 상수의 곱셈 최적화
- 함수 호출 인수의 지연된 pop 동작 방지(스택 최소화)
- 재귀 호출이 함수의 최종부에서 일어나지 않도록 최적화
- 단순 시간 지연 구간에 기능 삽입
- 자동 레지스터 할당
- 유추에 의한 변수 최적화
- 인라인 함수의 최적화와 스택 프레임 포인터의 제거
- 각 명령의 실행 사이클을 고려한 스케줄링
- 반복되는 코드 제거
- 루프에서의 동작 불변
- 인스트럭션에 대해 속성 부여 기능
- 각 하드웨어에서 지원하는 단축명령 기능에 의한 지역 최적화
-O0
최적화를 수행하지 않음.
-O1
-O2
가장 많이 사용하는 옵션
거의 대부분의 최적화를 수행.
-O3
가장 높은 레벨의 최적화
모든 함수를 인라인 함수로 취급해버림.
너무 많은 소스 변경이 생기므로 왜곡 발생.
-Os
사이즈 최적화를 수행
임베디드 시스템에서 자주 사용.
(4) 디버깅 옵션
-g
gdb에게 제공하는 정보를 바이너리에 삽입한다.
기본적으로 -g2와 동일.
-g0
디버깅 정보를 삽입하지 않음
-g3
디버깅 정보를 가장 많이 제공
-pg
프로파일을 위한 코드를 삽입함.
프로그램이 종료하면 프로파일 정보가 *.out 파일에 저장됨.
gprof에 의해 out 파일을 분석
----------------------------------------------------
as 옵션
----------------------------------------------------
gcc는 as옵션을 알지 못한다.
as에게 옵션을 지정하기 위해서는 -Wa,[as 옵션들] 형식으로 gcc를 거치지 않고 바로 전달해야 한다.
[as 옵션들]
-al
어셈블된 인스트럭션을 보인다.
-as
정의된 심볼을 보인다.
-l[패스]
include 디렉토리를 지정한다.
어셈블리 소스 내에서 사용된 .include 지정자가 지정하는 헤더파일을 찾을 때 사용.
-W 또는 --no-warn
경고를 출력하지 않는다.
-march=[아키텍쳐 문자열]
해당 어셈블리?
----------------------------------------------------
collect2 또는 ld 링크 옵션
----------------------------------------------------
-L[라이브러리 디렉토리]
라이브러리를 찾을 디렉토리를 지정.
-l[라이브러리 이름]
같이 링크할 라이브러리를 지정
라이브러리 이름앞의 lib을 떼고 확장자 이전까지를 라이브러리 이름으로 취급. (libtest.so => -ltest)
반드시 컴파일 명령에서 소스 파일의 뒤에 와야한다.
예) gcc -o test test.c -L/opt/lib -ltest
라이브러리를 main 보다 앞에 링크하면 undefined 참조 오류 발생.
그리고 라이브러리 내에 main 함수가 있다면 실행파일의 main 함수가 실행되지 않고 라이브러리 내의 main이 실행되버릴 수 있다.
-shared
공유라이브러리와 정적라이브러리가 같이 있을 경우 공유 라이브러리를 우선하여 링크
(아무 옵션을 주지않아도 공유 라이브러리 링크가 우선함)
-static
정적 라이브러리를 우선하여 링크
-nostdlib
링크시에 표준 C 라이브러리를 사용하지 않음.
-nostartfiles
crt1.o 등과 같은 start up 파일을 링크하지 않는다.
OS, 부트로더 등을 컴파일할 때 사용한다.
-Wl,[링크 옵션들]
gcc를 거치지 않고 바로 링크에게 옵션을 정해주고자할 때 사용한다.
[링크 옵션들]
-s
실행 파일에서 심볼 테이블 제거
-x
출력 파일에 로컬 심볼 제거
-n
텍스트 영역을 읽기전용을 만듦
-r
추후 링크가 가능하게 오브젝트를 만듦
-e [name]
시작 심볼을 name 심볼로 사용 (기본적으로 _start 심볼이 시작 심볼이다.)
-M
심볼들의 정보를 자세히 출력
-oformat [format]
주어진 형식의 오브젝트 파일을 생성
'Programming' 카테고리의 다른 글
Shell Script - 숫자연산 (0) | 2016.09.02 |
---|---|
Shell Script - 설명 (0) | 2016.09.02 |
Linux C - gcc message list (0) | 2016.09.02 |
JAVA - 객체 배열 선언 (0) | 2016.09.01 |
JAVA - 표준 코딩안 (0) | 2016.09.01 |