어제 놀고 있는 회사 컴퓨터를 여러 가지 용도로 쓸려고 새로 포맷하고 운영체제를 설치했습니다. 그닥 CPU 파워가 좋지 않은 컴퓨터 인데다 옛날 생각도 나고 해서 겁없이 윈도우 2000 서버를 설치해야 겠다고 생각을 했습니다. 개발자라면 대부분 그렇겠지만 2000은 나름 조금은 저에겐 각별한 운영체제였습니다. 98의 그 지긋지긋한 재부팅을 떠나게해 준 멋진 운영체제였기 때문이었죠.
하지만 그런 각별한 운영체제도 설치하기란 험한하기 짝이 없었습니다. 꼬깃꼬깃 쳐박혀 있는 MSDN의 쓸모없는 시디들 틈으로 2000 시디를 찾는 작업부터가 만만한게 아니었죠. MSDN 사이트에서는 아예 다운로드 받을 수 있는 항목이 없답니다. 하지만 끝끝내 결국에는 Korean이라는 글자가 큼지막하게 쓰여진 2000 부팅 시디들 찾아서 설치를 했습니다. 했습니다. 후훗~ 빠른 포맷 메뉴도 없는 운영체제를 깡과 끈기 하나로 설치를 했더랬죠.
오래된 것들이 다 그렇겠지만 어마어마한 패치가 기다리고 있었습니다. SP4를 설치하고 IE를 업데이트하고 보안 업데이트를 모두 하고 드라이버를 죄다 깔고... 터미널 서비스도 설치하고... 나름 쓸만한 서버가 되가고 있었습니다. ㅋㅋ
그런 작업들이 어느 정도 정리가 될 즈음 그 곳으로 svn을 복사했습니다. 저의 힘든 여정도 마무리 되는가 싶었죠. 풉. 복사를 하고 터미널 클라이언트로 접속해서 svnadmin을 더블 클릭했습니다. 왠걸. 듣도보도 못한 듣보잡 에러가 저를 반기는 것이었습니다. 아래와 같은 참 어처구니 없는 에러 메시지였죠.
그렇습니다. svnadmin은 msvcrt.dll에서 __crtLCMapStringW를 찾으려하고, msvcrt.dll은 그걸 가지고 있지 않은 것이죠. 이 때 까지만 해도 저는 그냥 사소한 에러라 생각을 했습니다. 음. msvcrt.dll이 오래된 것이라 그런가 보구나. 그래서 .NET 2003, 2005의 CRT를 죄다 설치했습니다. 물론 거기엔 msvcrt.dll은 없습니다. 하지만 그냥 업데이트 되지 않을까하는 생각이었죠. 순진한 생각이었습니다. 결국 저는 저걸 가지고 있는 msvcrt.dll을 찾을 수 없었습니다.
구글에는 이 문제를 호소하는 많은 글들이 있더군요. 2k의 msvcrt.dll에 특정 함수가 빠져있다. 왜 그렇냐? 하지만 MS의 입장은 2k는 더 이상 지원하지 않는 운영체제다. 배째라. 콱 배를 째버릴 수도 없고 말이죠. 15시간이 넘게 들인 정성. 우째. 들인 공이 아까워서 말이죠. ~
그래도 우리는 개발자 아니겠습니까? 없으면 있게라도 만들 수 있지 않을까요? 그래서 문제의 msvcrt.dll을 열어 보았습니다. __crtLCMapStringW는 빠진 함수 중에 하나 더군요. 저렇게 빨갛게 표시되는 없는 함수들이 한 두 개가 아니었습니다. 흑흑.~
물론 제 컴퓨터의 msvcrt.dll을 복사하면 되겠지라는 단순한 생각을 안해본건 아니었습니다. 후훗. 제 msvcrt.dll을 2k에서 열어보면 아래와 같이 보인답니다. 이 새 msvcrt.dll에서는 ntdll.dll의 RtlGetNtVersionNumbers란 함수를 사용하는데 이넘이 또 2k에는 익스포트가 되 있지 않나봅니다. 흑흑~
통밥으로 봐도 저 함수를 msvcrt.dll 안에서 쓰는데는 몇 군데 안될거 같죵? 디스어셈 해보면 정말 한 군데 밖에 없습니다. 뭐 그렇겠죠. 그 부분을 패치하고 DLL의 임포트 정보에서 저걸 참조하는 것을 제거한 DLL을 2k에 복사하면 동작할 수 있을까요? 다른 부분이 100% 호환된다면 이론적으론 불가능하진 않겠죠.~
전 지금 2k3 서버를 설치하는 중이랍니다...
첫사랑은 가슴 속에 간직하는게 미덕이란 말이 떠오르는군요...