Windows ConfidentialDLL 지옥 탈출

Raymond Chen

DLL 지옥 이것은 너무나 함정이 많아 붙은 별명입니다. 어떤 프로그램을 설치했는데 갑자기 관련이 없어 보이는 프로그램이 작동을 멈춘 것을 본 적이 있을 것입니다. 사람들은 잘 모르지만 이는 두 프로그램이 공유 DLL 파일을 통해 연결되었기 때문입니다. 이와 같은 두 프로그램에서 어떤 버전의 MSVCRT.DLL 파일이 시스템 디렉터리에 있어야 하는지에 대해 각기 다른 설정을 가지고 있을 수 있습니다. 또는 첫 번째 프로그램이 두 번째 프로그램이 사용하는 ActiveX® 컨트롤을 업그레이드하여 두 번째 프로그램이 호환되지 않을 수도 있습니다.

두 프로그램 모두 회사에서 업무를 처리하는 데 중요하다면 어느 프로그램에 잘못이 있는지는 중요하지 않습니다. 중요한 것은 프로그램을 어떻게든 실행해야 한다는 것입니다. "비용 손실이 발생하고 있습니다."와 "김영수 과장 때문에 비용 손실이 발생하고 있습니다." 사이에는 큰 차이가 없습니다. 어느 쪽이든 회사에 비용 손실이 발생하고 있으므로 즉시 문제를 해결해야 합니다.

과거에는 이와 같은 경우 어떤 프로그램을 살리고 어떤 프로그램을 포기할지 선택해야 했습니다. 그러나 Windows® 2000부터는 이러한 충돌을 해결하는 데 사용할 수 있는 응급 조치가 지원되었습니다. 하지만 이러한 조치는 좀 더 영구적인 해결책을 찾을 때까지 시스템을 가동시키기 위한 일시적인 솔루션일 뿐입니다.

Windows 2000에는 현재 Dynamic-Link Library Redirection이라는 멋진 이름을 가지고 있는 솔루션의 초기 버전이 구현되었습니다. DLL을 리디렉션하기 위해서는 리디렉션할 DLL 파일이 있는 프로그램과 같은 이름의 파일을 만들고 이름 뒤에 .local을 추가해야 합니다. 예를 들어 C:\Program Files\Litware Inc\Invoice.exe에 리디렉션을 적용하려면 C:\Program Files\Litware Inc\Invoice.exe.local이라는 파일을 만듭니다. 파일의 내용은 중요하지 않습니다. 중요한 것은 그 파일이 존재한다는 것입니다.

프로그램에 리디렉션을 활성화하면 이 프로그램에서 DLL 파일을 로드하려고 시도할 때마다 평상시의 검색 위치를 찾기 전에 프로그램이 위치한 디렉터리를 먼저 찾습니다. 따라서 MSVCRT.DLL 파일이 충돌하는 경우 각 프로그램마다 리디렉션을 활성화하고 MSVCRT.DLL 사본을 각 프로그램의 설치 디렉터리에 넣으면 됩니다. 그러면 각 프로그램은 자신의 MSVCRT.DLL 버전(프로그램을 테스트할 때 사용한 DLL 버전)을 사용하게 됩니다.

이 기법의 매력은 프로그램이 전체 경로를 사용하여 DLL을 로드할 때도 작동한다는 것입니다. 예를 들어 프로그램이 C:\Program Files\Common Files\Proseware Inc\taxplugin.dll을 로드하려고 한다고 가정해 보겠습니다. Proseware 2.0으로 업그레이드한 다음부터 세금 플러그인이 구매 프로그램과 호환되지 않습니다. 이 경우 이전 버전의 세금 플러그인을 C:\Program Files\Litware Inc\taxplugin.dll에 복사하면 됩니다. 프로그램이 전체 경로를 사용하여 세금 플러그인을 로드해도 DLL 리디렉션은 현재 디렉터리를 검색해서 Proseware Inc 디렉터리에 있는 버전 대신 .local 버전을 사용합니다.

Windows XP 및 Windows Vista™에서는 DLL 리디렉션 규칙이 약간 다르긴 하지만 기본적인 원리는 같습니다. .local 파일뿐만 아니라 .local 디렉터리도 만들 수 있습니다. 이 경우 프로그램의 설치 디렉터리가 아닌 .local 디렉터리가 검색됩니다. 따라서 같은 디렉터리 내의 여러 프로그램에 충돌 없이 리디렉션을 적용할 수 있습니다.

그러나 응용 프로그램 매니페스트가 포함된 프로그램에는 리디렉션을 적용할 수 없으며 소위 알려진 DLL도 리디렉션에서 제외됩니다. 자세한 내용은 "Dynamic-Link Library Redirection(영문)"을 참조하십시오.

DLL 리디렉션만으로 DLL 지옥에서 완전히 빠져나올 수 있는 것은 아니지만 최소한 문제를 알아내는 동안이라도 상처를 돌보는 응급 수단으로 사용할 수는 있을 것입니다.

그림 1

그림 1   

Raymond Chen은 자신의 웹 사이트인 The Old New Thing(영문)과 같은 제목의 책(Addison-Wesley, 2006)에서 Windows의 역사와 Win32 프로그래밍에 대해 적고 있습니다. 하지만 그에게 The Old New Thing이라는 이름의 고양이는 없습니다.

© 2008 Microsoft Corporation 및 CMP Media, LLC. All rights reserved. 이 문서의 전부 또는 일부를 무단으로 복제하는 행위는 금지됩니다..