학습자료(~2017)/C,C++

[GCC]gcc 컴파일 옵션

단세포소년 2012. 8. 13. 18:16
반응형

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

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을 재정렬

 

반응형