어제 개발자 분들과 술을 한잔 하다가 재미난 이야기를 들었습니다. 드라이버를 만들면 릴리즈 버전에서도 항상 디버깅 정보가 포함된다는 이야기였죠. 저는 '그럴리가요?'라고 했죠. 일반적으로 어플리케이션의 경우에는 프로젝트 속성을 조절해서 디버그 정보 유무를 결정할 수 있기 때문입니다. 그런데 드라이버는 잘 몰라서 거기서 어떻게 하는지는 모르고 있었습니다. 어제 화두를 던졌던 window31님 말씀으로는 DDK 버전별로 차이가 있는것 같다고 하시더군요.
문득 오늘 술깨고 생각나서 간단한 드라이버를 만들어 보았습니다. DriverEntry만 만들어서 XP free 환경에서 빌드를 해보았습니다. 후훗. 그런데 어제 들은 이야기대로 릴리즈 버전임에도 버젓히 디버깅 정보가 들어 있더군요. 아래 그림처럼 드라이버 파일에 빌드한 환경의 전체 경로가 나옵니다.
이런걸 몹시 찝찝해 하시는 분들도 계시죠. 그래서 왜 그럴까? 하고 뜯어 봤습니다. ddk 문서도 찾아보고 링커 옵션을 제어할 수 있는 방법도 찾아보고 해도 딱히 방법이 없더군요. NTDEBUG를 통해서 조절하라는 이야기가 있었는데 해보니까 안됐습니다. 그래서 DDK를 빌드하는 실제 makefile을 열어봤습니다. 제 버전의 경우에는 DDK 설치 폴더에 bin 밑에 있더군요. makefile.new입니다. 파일을 쭈욱 내려가다 보면 아래와 같은 부분이 보입니다.
!ifdef RESOURCE_ONLY_DLL
Resource only DLL's have no exports, no entrypoint, no code, no data, no debug symbolic.
LINKER_DBG_SECTION=-debug:NONE
NO_DLL_EXPORTS=1
!undef NTBBT
!undef DLLENTRY
!undef NOLINK
NO_BROWSER_FILE=1
LINK_NO_RELEASE=1
MAKEDLL=1
TARGETLIBS=
LINKLIBS=
USE_NOLIBS=1
NO_NTDLL=1
AFX_FORCE_STDAFX=
AFX_FORCE_USRDLL=
MFC_LIBS=
!else
LINKER_DBG_SECTION=-debug
AFX_FORCE_STDAFX=/include:__afxForceSTDAFX
AFX_FORCE_USRDLL=/include:__afxForceUSRDLL
!endif
훗. 그렇죠. 리소스 온리 DLL이 아니면 항상 디버그 정보가 포함이 되는 겁니다. 따라서 밖에서 무엇을 해줘도 항상 디버깅 정보가 포함되는 거죠. 알았으면 고쳐야겠죠. 시스템 파일을 고치는 거라 좀 찝찝하시다면 복사해서 고치셔도 됩니다. 전 아래와 같이 고쳤습니다.
!if "$(DDKBUILDENV)" == "fre"
LINKER_DBG_SECTION=-debug:NONE
!else
LINKER_DBG_SECTION=-debug
고친 다음 다시 빌드를 해보면 릴리즈 버전에서는 더 이상 디버그 정보가 포함되지 않는다는 걸 알 수 있습니다.