2005년 09월 01일
컴파일러 옵션 대강 정리한것 퍼움
릴리즈 빌드를 포함하여 모든 빌드를 디버깅 심볼로 빌드하면 디버거가
소스와 줄 정보, 변수명, 프로그램 데이터 형식정보를 얻을수 있다.
.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를 제거한다.
소스와 줄 정보, 변수명, 프로그램 데이터 형식정보를 얻을수 있다.
.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 | 2005/09/01 11:22 | Programming | 트랙백 | 덧글(2)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]