[VS 2005 버그] FAT32를 사용하는 경우 VC++에서 빌드한 바이너리가 잘못 생성되는 경우


이 버그는 결과적으로 잘못된 바이너리를 생성하는 버그이기 때문에 해결방법을 위한 옵션이 VS2005에 추가되어있습니다. 현재 KB를 만들고 있는 중이지만, 모르고 있을 경우에는 치명적이기 때문에 알려드립니다.


[버그재구성]


FAT32 파일시스템을 사용하는 파티션에 MFC 솔루션을 생성한다.


[버그내용]


버그의 결과로 인해서 다양한 오류가 발생한다. 대표적으로 프로그램을 실행할 경우에 MFCxxx.dll이 존재하는데 존재하지 않는다는 오류가 나는 현상, DLL 로드가 이유없이 실패하는 현상등이 있다. 이는 생성된 바이너리에 잘못된 정보로 인한 결과다.


[버그원인]


FAT32의 파일시스템에는 타임스탬프의 단위가 초 단위이기 때문에 초 이하의 단위로 변경된 파일을 타임스탬프로 구분을 하는 경우에는 잘못된 결과가 나온다. 1초에 생성된 파일과 1초99에 Update된 파일은 모두 파일 스탬프가 1초이기 때문에 타임스탬프로 보면 파일에는 변화가 없던 것이다. VC++의 Incremental Link 기능에서 매니페스트 파일이 갱신 되었는가를 가리기 위해서 타임스탬프를 보는데, 링커는 이로 인해서 초단위 이내로 갱신된 변화를 알아채지 못하고 매니페스트만 변경없이 유지된다. 즉 갱신되어 링크되어야하는데 이 과정이 누락되어 결과적인 바이너리가 잘못된 내용을 담고 있게 된다.


[버그해결방안]


프로젝트를 생성한 뒤에 Solution Explorer(솔루션 탐색기)에서 프로젝트명을 오른쪽 클릭하여 Properties(속성)를 선택한다. Property Pages(속성 페이지) 다이얼로그창의 왼쪽 트리에서 Configuration Properties(구성 속성)->Manifest Tool(매니페스트 도구)->General(일반)을 선택하고, 오른쪽에서 Use FAT32 Work-around(FAT32 해결 방법 사용)의 값을 Yes(예)로 바꿔준다.


--


해당 버그는 불편하지만 옵션으로 제공되었고, 불편하지만 FAT32를 사용하는 경우라면 문제가 없더라도 켜 놓는 것이 좋습니다.


 


Comments (0)

Skip to main content