컴파일러 옵션 대강 정리한것 퍼움

릴리즈 빌드를 포함하여 모든 빌드를 디버깅 심볼로 빌드하면 디버거가

소스와 줄 정보, 변수명, 프로그램 데이터 형식정보를 얻을수 있다.

.PDB(Program Database)에 이런 정보들이 저장된다



아래의 내용은 native프로그램에서 위의 정보들을 설정하는 방법이다.



디버그심볼 정보 생성 스위치 --------------------------------------------------



/Zi

C/C++ ->일반->디버깅정보형식 : 프로그램데이터베이스(/Zi)

[ZI] 편집하며 계속하기는 추가 패딩(Padding)바이트로 프로그램이 너무 커진다.



/Incremental:NO

링커->일반->증분링크사용 : 아니오(/Incremental:NO)



/DEBUG

링커->디버깅->디버그정보생성 : 예(/DEBUG)

프로그램 데이터베이스 파일생성 에는 $(OutDir)/$(ProjectName).pdb 를 설정

전용 기호제거 에는 $(OutDir)/$(ProjectName)_STRIPPED.pdb 를 설정



/OPT:REF

링커->최적화->참조 : 참조하지 않는 데이터 제거(/OPT:REF)

/DEBUG옵션을 주어도 참조하지 않는 모든 함수를 다 가져오지 않는다.



/OPT:ICF

링커->최적화->COMDAT정리 사용 : 중복 COMDAT제거(/OPT:ICF)

특정 상수값에 대한 모든참조에 대해 단 하나의 상수 데이터 변수를 가지게

동일 COMDAT 레코드 결합



추가정보

/W4

C/C++ ->일반->경고수준 : 수준4(/W4)

/WX

C/C++ ->일반->경고를 오류로 처리 : 예(/WX)

모든 경고를 위와 같이 에러로 처리하는 대신에 경우에 따라 코드상에서 경고수준을 낮출수 있다.

#pragma warning (push, 3)

//#include "IDoNotCompileAtWarning4.h"

#pragma warning (pop)



#pragma warning (disable:4021) //매개변수 미사용 에러 잠시 무시

// ...

#pragma warning (default:4021)



또는 int GoodMethod( int /*i*/ ){} 등으로 4021을 피할수 있다.




/BASE (기준주소)

링커->고급->기준주소 : 0x00000000 (해당주소)

기준주소를 조정하여 재배치 문제를 피할 수 있다.

운영체제 DLL : 0x70000000 ~ 0x78000000

DLL 첫글자에 따라 아래와 같이 배치하면 재배치를 피할 수 있다.

A-C:0x60000000 / D-F:0x61000000 / G-I:0x62000000 / J-L:0x63000000 / M-O:0x64000000

P-R:0x65000000 / S-U:0x66000000 / V-X:0x67000000 / Y-Z:0x68000000



REBASE /b 0x62000000 GAAA.DLL GBBB.DLL (명령표시줄에서 다시 재배치)





[[ 기타 선행 디버깅에 도움을 주는 옵션 ]]



컴파일러 스위치 -------------------------------------------------------------



/EP /P 또는 /P

C/C++->전처리기->전처리 파일생성 : /EP /P

전처리파일을 생성하면 .I 확장자로 매크로 확장된 소스를 볼수 있다.

/C와 함께 사용하면 주석도 유지된다.

잠깐 사용후 다시 원위치 해야한다.



/X

C/C++->전처리기->표준포함경로 무시 : /X

표준포함 경로를 무시하고 /I로 명시적으로 지정한 위치의 헤더만 찾게할수 있다.



/Zp

C/C++->코드생성->구조체 멤버 맞춤 : /Zp사용하지 말아라!

만약 사용한다면, #pragma pack(show)옵션을 주어 빌드창에 표시해라



/Wp64

C/C++->일반->64비트 이식성 문제 검색 : /Wp64

64비트 이식성을 개발 초기부터 검사할 수 있다.



/RTC

C/C++->코드생성->작은형식검사 : /RTCc

C/C++->코드생성->기본런타임검사 : /RTCu

/RTCc는 작은 데이터형식 변환시 손실을 검사 : 모든 지역변수를 0xCC로 초기화 하여

훌륭한 스택 프레임 검사가 로컬 변수 언더런과 오버런을 감지하고

스택충돌에 대해서 스택 포인터를 검증한다.

/RTCu는 초기화되지 않은 변수 참조를 추적



/GS

C/C++->코드생성->버퍼보안검사 : /GS

리턴주소가 덮어 써졌는지 보안검사 코드를 추가 : 바이러스 작성이 어려워진다.

릴리즈 빌드에서 기본인데 디버그 빌드에도 포함해라.



/O1 (크기최소화)

C/C++->최적화->최적화 : /O1

기본적으로 마법사는 /O2(속도 최적화)를 사용한다. 실제로는 /O1을 사용해야 한다.

/O1을 사용하여 응용프로그램의 페이지 결함을 줄여 속도를 높일수 있다.

Working Set으로 가장많이 호출되는 함수들을 앞쪽에 정렬 할수 있다.



/GL (전체프로그램 최적화)

구성속성->일반->전체프로그램최적화 : 예(/GL)

프로그램이 링크될때 교차하일 최적화를 사용하게 된다.

이 스위치는 링커에 /LTCG를 설정하게 된다.



/showinclude

C/C++->고급->포함표시 : 예(/showinclude)

포함된 모든 파일을 계층구조로 나열한다.



링커 스위치 -------------------------------------------------------------

/MAP (맵파일생성)

/MAPINFO:LINES (맵파일에 줄 번호 정보 포함)

/MAPINFO:EXPORTS (맵파일에 익스포트 함수 정보 포함)

링커->디버그

링크된 이미지에 대한 MAP파일을 생성한다.

MAP파일은 텍스트 형식의 심볼 정보를 얻는 유일한 방법



/NODEFAULTLIB

링커->입력->모든 기본라이브러리 무시

#pragma comment(lib, XXX)를 모두 무시한다. 이를 이용 어떤 순서로 링크할 것인지 제어 가능



/OPT:NOWIN98

링커->최적화->Windows 98에 맞게 최적화 : NOWIN98

이 스위치를 사용하면 9x계열을 위해 섹션이 반드시

4K 경계로 정렬될 필요 없음을 지정하여 프로그램 크기를 줄인다.



/ORDER (함수에 순서 지정)

링커->최적화->함수 순서

함수의 순서를 포함하고 있는 파일을 사용한다.



/VERBOSE (진행메세지 표시)

/VERBOSE:LIB (검색된 라이브러리만 나타내는 진행 메세지를 표시)

링커->일반->진행률표시



/LTGC (링크 시간 코드 생성)

/GC와 짝을 이뤄 교차컴파일 최적화를 수행. /GC설정시 자동설정.



/RELEASE (체크섬 설정)

PE헤더에 체크섬 값을 설정한다.



/PDBSTRIPPED (전용 기호 제거)

스택탐색코드가 현재 스택을 해독하기 위해서 필요한 FPO 데이터를 갖고 있지 못한데,

전용기호가 제거된 PDB파일을 생성가능한 옵션.

전체PDB가 아닌 변수와, 소스, 줄 정보를 제거한 FPO와 공용함수만 남긴 PDB 생성한다.

고객에게 XXXXX_STRIPPED.PDB전달후 Dr.Watson과 같은 툴이 PDB를 로드하려면

_STRIPPED를 제거한다.

by jungmoona | 2005/09/01 11:22 | Programming | 트랙백 | 덧글(2)

트랙백 주소 : http://jungmoona.egloos.com/tb/552135
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 수렁 at 2005/09/01 17:56
후아, 너무 많다. 몰라도 되는 것들이 많아; Option은 최소한으로 바꾸는 게 좋은 듯.
Commented by 김경순 at 2009/05/20 16:27
좋은 내용 감사합니다. 담아가서 사용할께요...

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶