본문 바로가기

프로그래밍

gcc 컴파일 옵션

1. 링크 옵션

 옵션

설명 

 -lname  링크할 때 name인 lib를 찾음
 -nodefaultlibs  링크할 때 표준 시스템 lib를 사용하지 않음
 -nostartfiles  링크할 때 표준 시스템 startup 파일을 사용하지 않음
 -nostdlib  링크할 때 표준 시스템 startup과 lib를 사용하지 않는다
 -s  완성된 바이너리에서 모든 심볼 테이블과 재배치 정보를 제거
 -shared

 공유 오브젝트를 생성

(다른 오브젝트와 링크하여 실행 파일을 생성할 수 있음)

 -shared-libgcc  libgcc의 공유 라이브러리 버전을 강제로 지정해서 사용
 -static  정적 라이브러리를 이용하여 링크
 -static-libgcc  libgcc의 정적 라이브러리 버전을 강제로 지정
 -u sym  심볼 sym이 정의되어 있지 않은 것처럼 동작해서, 심볼 sym을 정의한 라이브러리 모듈과 강제로 링크
 -WI, opt  링크 옵션으로 opt를 전달
 -Xlinker opt  링크 옵션으로 opt를 전달

 

2. 경고 옵션

옵션

 설명 

 -fsyntax-only  코드를 컴파일 하지 않고 문법 검사만 함
 -pedantic  ISO표준에서 요구되는 모든 경고 메시지를 설정, 다른 종류의 기능을 받아들이지 않는다
 -pedantic-errors  -pedantic 옵션에 의해서 발생한 경고 메시지를 에러로 변환, 컴파일을 멈춤
 -w  모든 경고 메시지를 출력되지 않도록 함
 -W  특정 상황에서 추가적인 경고 메시지를 출력
 -Wall  모든 경고를 켠다
 -Wbad-function-cast  함수 호출이 호환되지 않는 형으로 변환될 때 까지 경고 메시지를 출력(C 전용)
 -Wcast-qual  형 변환이 형 수식어를 없앨 때 경고 출력 (const char* -> char*)
 -Wchar-subscripts  Char 형 변수가 배열 첨자로 사용될 때 경고 출력
 -Wcomment  중첩된 주석이 있을 때 경고 출력
 -Wconversion  음수 정수형 상수가 부호 없는 정수형에 대입될 때 경고 출력
 -Wdisabled-optimization  사용자가 요구한 최적화가 이루어지지 않았을 때 경고 출력
 -Werror  모든 경고를 에러로 변환해서 컴파일을 멈추게 함
 -Werror-implicit-function-declaration  함수가 처음으로 사용되기 전에 명시적으로 선언되지 않았을 때 에러 출력
 -Wfloat-equal  부동 소수점 값이 등호로 비교되었을 때 경고 출력
 -Wformat  printf()함수 계열에 입력된 인자가 주어진 형식 문자열과 맞지 않을 때 경고 출력
 -Wformat-security  printf()함수 계열에 입력된 인자에 대해 잠재적인 보안 문제가 있을 때 경고 출력
 -Wimplicit  -Wimplicit-int + -Wimplicite-function-declaration
 -Wimplicit-int  선언에서 형을 지정하지 않았을 때 경고 출력
 -Wimplicite-function-declaration  함수가 처음으로 사용되기 전에 명시적으로 선언되지 않았을 때 경고 출력
 -Winline  Inline으로 선언된 함수가 인라인되지 않았을 때 경고 출력
 -Wlarger-than-n  오브젝트 파일의 크기가 n 바이트보다 클 때 경고 출력
 -Wmain  main() 의 반환형이나 선언이 잘못되었을 때 경고 출력
 -Wmissing-braces  집합체나 공용체의 초기화에서 괄호가 잘못된 경우 경고 출력
 -Wmissing-declarations  전역 변수가 선언되지 않고 사용되었을 때 경고 출력
 -Wnested-externs  extern 선언이 함수 선언 안에 있을 때 경고 출력
 -Wno-deprecated-declarations  더 이상 쓰이지 않는 기능을 사용한 것에 대해 경고를 출력하지 않음
 -Wno-div-by-zero  0으로 나눗셈하더라도 경고를 출력하지 않음
 -Wno-format-y2k  2자리 연도를 출력하는 strftime() 형식에 대한 경고를 출력하지 않음
 -Wno-format-extra-args  printf() 함수 계열에 입력된 여분의 인자에 대해 경고를 출력하지 않음
 -Wni-long-long  Long long형을 사용하는 것에 대해 경고를 출럭하지 않음
 -Wno-multichar  멀티 바이트 문자를 사용한 것에 대해 경고를 출력하지 않음
 -Wpadded  구조체가 정렬을 위해 패딩 될 때 경고 출력
 -Wparentheses  잘못된 괄호에 대한 경고 메시지 출력
 -Wpoint-arith  코드 수행이나 구조체가 함수 형이나 void 포인터의 크기에 의존적일  경고 출력
 -Wredundant-decls  오브젝트가 유효 범위 안에서 여러 번 선언되거나, 유효 범위 밖에서 사용되었을 때 경고 출력
-Wreturn-type  함수의 반환형이 지정되지 않았거나 값을 반환하는데 void로 선언된 경우 경고 출력
-Wsequence-point  C sequence point rule을 위반하는 코드에 대해 경고 출력
-Wshadow  지역변수가 다른 지역변수, 매개변수, 내장함수를 ovrride할 때 경고 출력
-Wsign-compare  부호가 있는 값과 부호가 없는 값 비교 시, 형변환 때문에 잘못된 값이 나올 때 경고 출력
-Wstrict-prototypes  함수가 인자 형을 지정하지 않은 채 선언, 정의되었을 때 경고 출력
-Wswitch  Switch 구문에서 모든 경우의 값을 다루지 않을 때 경고 출력
-Wsystem-headers  시스템 헤더 파일의 코드에 대한 경고를 출력
-Wtraditional  ISO표준과 traditional c에서 다르게 동작하거나 없는 코드를 사용했을 때 경고 출력
-Wtrigraphs  주석 영역의 바깥 부분에 3중문자가 있을 때 경고 출력 ex) ??= -> #
-Wundef  정의되지 않은 식별자가 #if…#endif 구분에서 사용되었을 때 경고 출력
-Wuninitialized  자동 변수가 초기화되지 않고 사용되었을 때 경고 출력
-Wunknown-pragmas  GCC가 익식하지 못하는 #pragma가 사용되었을 때 경고 출력
-Wunreachagle-code  실행되지 않은 코드에 대해 경고를 출력
-Wunused  -Wunused 류의 옵션을 모두 켠다
-Wunused-function  선언은 되어 있으나 사용되지 않은 함수에 대해 경고를 출력
-Wunused-parameter  선언은 되어 있으나 사용되지 않은 parameter에 대해 경고를 출력
-Wunused-value  선언은 되어 있으나 사용되지 않은 계산 결과에 대해 경고를 출력
-Wunused-variable  선언은 되어 있으나 사용되지 않은 변수에 대해 경고를 출력

 

3. 디버깅 옵션

 옵션

설명 

 -d [mod]  컴파일 지점 mod에서 디버깅 정보 덤프를 생성
 -fdump-class-hierarchy [-option]  각 클래스의 계층 구성과 가상 함수 테이블을 파일로 덤프
 -fdump-translation-unit [-option]  전체 변환에 대한 트리 구조 표현을 파일로 덤프
 -fdump-tree [-switch[-option]]  여러가지 처리 단계에서 중간 언어 트리를 파일로 덤프
 -fdump-unnumbered  디버깅 정보를 덤프 할 때에 줄 정보와 명령어 숫자를 포함하지 않음
 -fmem-report  각 컴파일 단계에서 메모리 할당에 관한 통계를 표시
 -fpretend-float  타겟 시스템이 호스트 시스템과 같은 부동 소수점 형식을 가진다고 가정함
 -fprofile-arcs   profile 프로그램을 삽입한다.  ex) test.c -> test.c.du
 -ftest-coverage  커버리지 테스트 프로그램임 gcov에서 사용하는 데이터를 생성
 -ftime-report  각 컴파일 단계에 대한 성능 통계를 표시
 -g [n]  시스템 디버깅 형식으로 n 단계 디버깅 정보를 생성 (출력할 정보 양을 지정하기 위해서)
 -gcoff [n]  COFF형식으로 n 단계 디버깅 정보를 생성
 -gdwarf  DWARF 형식으로 디버깅 정보를 생성
 -gdwarf+  GDB에서 쓰이는 확장을 이용해서 DWARF 형식으로 디버깅 정보를 생성
 -gdwarf-2  DWARF 버전 2형식으로 디버깅 정보를 생성
 -ggdb [n]  GDB에서만 사용할 수 잇는 디버깅 정보를 생성
 -gstabs [n]  STABS 형식으로 n 단계 디버깅 정보를 생성
 -gstabs+  GDB에서 쓰이는 확장을 이용해서 STABS형식으로 디버깅 정보를 생성
 -gvms [n]  VMS 형식으로 n단계 디버깅 정보를 생성
 -gxcoff [n]  XCOFF형식으로 n 단계 디버깅 정보를 생성
 -gxcoff+  GDB에서 쓰이는 확장을 이용해서 XCOFF형식으로 디버깅 정보를 생성
 -p  prof 프로그램에서 사용하는 profiling정보를 덤프하는 추가적인 코드 생성
 -pg  gprof 프로그램에서 사용하는 profiling정보를 덤프하는 추가적인 코드 생성
 -Q  컴파일 되는 각각의 함수 이름과 각 컴파일 단계가 얼마나 오래 걸렸는지 표시
 -time  컴파일 단계 각각에서 CPU시간이 얼마나 쓰였는지 표시

 

4. 최적화 옵션

 옵션

설명 

 -O  -O1과 같음
 -O0 (숫자 0)  최적화를 하지 않음
 -O1  코드사이즈의 감소와 실행속도향상을 목표로 최적화함,변수를 레지스터에 할당하거나,다중조건점프의 최적화 등을 행함
 -O2  고도의 최적화를 하며, 대부분이 최적화가 됨. 
루프전개와 함수의 인라인전개,레지스터의 rename을 하지않음.
 -O3  -O2 것보다 진보된 최적화를 행함. 
루프전개나 함수의 인라인 전개등도 행함.
 -Os  코드사이즈를 작게 하기 위한 최적화를 행함. 
-O0∼3등의 실행 속도를 향상시키는 옵션을 모두 병행할 수 있음.

 

5. i386 / AMD x86-64 옵션

 옵션

설명 

 -mtune=cpu-type  cpu-type에 최적화된 바이너리를 생성
 -march=cpu-type  지정한 cpu-type을 위한 명령어를 생성
(-mcpu=CPU-type을 포함)
 -mfpmath=unit  부동 소수점 유닛 unit에 맞는 부동 소수점 연산을 생성(unit:387,sse)
 -masm=dialect  dialect를 사용해서 asm 명령어를 출력
 -mno-fancy-math-387  GCC가 387에 대한 sin, cos, sqrt 명령어를 생성하지 않게 됨
 -mno-fp-ret-in-387  GCC는 값을 반환할 때, 일반적인 CPU 레지스터를 사용해서 반환
 -msoft-float  부동 소수점 연산에 대해 라이브러리 호출을 담고 있는 출력을 생성
 -maccumulate-outgoing-args  함수 도입부에서 인자가 필요한 공간의 최대 크기 계산(-mpush-args 포함)
 -m128bit-long-double  Long double을 저장하는데 128비트를 사용함
 -malign-double  double, long double, long long 변수를 2워드 경계로 정렬
 -mpreferred-stack-boundary=num  스택 경계를 2의 num승 바이트 경계로 정렬
시스템에 따라 필요한 경계 값이 다름
 -msahf  GCC가 64 bit로 생성된 SAHF 명령을 사용 할 수 있도록 함
 -mrecip  RCPSS와 RSQRTSS 명령을 사용 할 수 있도록 함
 -mmmx  MMX 확장 명령어에 대한 직접적인 접근을 가능하게 해주는 내장 함수를 사용 가능
 -msse  SEE 확장 명령어에 대한 직접적인 접근을 가능하게 해주는 내장함수를 사용 가능
 -mrtd  고정된 개수의 인자를 받는 함수가 num명령어와 함께 반환되어 반환 도중에 인자를 꺼내는 함수 호출 방식을 사용 할 수 있음
 -m96bit-long-double  Long double을 저장하는데 96비트를 사용함
 -mregparm=num  정수형 인자를 전달하는데 사용하는 레지스터의 개수를 조정할 수 있음
 -m3dnow  3Dnow 확장 명령어에 직접 접근이 가능하게 해주는 내장함수 사용 가능
 -mcpu=CPU-type  지정한 CPU-type을 위해 만들어진 코드를 조정
 -momit-leaf-frame-pointer  리프 함수를 위한 레지스터에서 프레임 포인터를 유지하지 않음
 -mthreads  Mingw32 플랫폼에서 thread safe exception처리를 지원
 -mno-align-stringops  인라인된 문자열 연산의 목표 지점을 정렬하지 않음
 -minline-all-stringops  모든 문자연 연산을 인라인 함, 코드 사이즈는 커지지만 작은 길이의 문자열의 경우 성능 향상
 -mpush-args  매개변수를 저장하는데 PUSH 연산을 사용
 -mno-tls-direct-seg-refs  TLS 변수에 대한 컨트롤
 -mstackrealign  Runtime stack을 재정렬

 


출처 : http://alisa2304.tistory.com/105