2010/08/27 19:14
http://blog.naver.com/drvoss/20048402862 Dependency Walker : http://www.dependencywalker.com/
오늘 세미나에서 VS2008, 혹은 VS2008 feature pack에 있는 DLL들을 같이 배포 해야 하는가 라는 질문을 받았습니다. 아마도 클라이언트 PC에 2005로 컴파일된 바이너리와 2005 재배포패키지에 있는 DLL파일이 이미 배포되어 있는 상태이셨던것 같습니다.
어플리케이션은 빌드 당시에 물었었던 DLL로 링크가 됩니다. 메니페스트 파일에 이러한 내용들이 링크타임에 기술이 되게 되며,운영체제에서는 이것들을 DLL 버전등에 기반한 side by side로 관리를 합니다.
Windows 폴더에 가보시면 WinSxS 라는 폴더가 존재 하는데, 이 폴더에 보시면 같은 파일들이 각 버전별로 서로 분리가 되어 있습니다. 처음 보시는 분들은 시스템에 따라 엄청나게 많은 폴더에 있는 같은 파일에 당황스러우실 껍니다.
Side by side를 고려 하지 않으면, 보통 exe파일과 같은 폴더에 있는 DLL을 사용할 것이라 잘못 생각할 수 있습니다.
Dependency Walker로 exe 파일을 열면 아래와 같이 exe 파일이 물고 있는 DLL들의 목록이 보여 집니다.
여기서 F9를 눌러 보면 각 DLL 들의 Full Path가 나오게 됩니다.
아래 그림에서 보시는 것처럼 ALZip.exe은 커먼컨트롤 DLL을 winsxs 폴더에 저 경로의 것을 사용합니다. ALZip.exe가 있는 폴더에 다른 버전의 같은 DLL 파일을 복사해도 ALZip.exe는 winsxs에 있는 DLL 파일을 이용할 껍니다.
제 컴퓨터에는 아래의 두개의 경로에 같은 커먼컨트롤DLL 파일이 존재 합니다.
C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6000.16386_none_87e0cb09378714f1
C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.6000.16386_none_5d07289e07e1d100
디펜즈에서 보시는 것 처럼 첫번째 것을 사용하고 있는데, 두번째 것을 ALZip.exe와 같은 경로로 복사를 해도 여전히 winsxs 폴더에 것을 사용하고 있음을 확인하실 수 있습니다.
exe파일의 경우 자신이 링킹될 때 참고된 DLL에 대한 메니페스트를 가지고 있고, 나중에나중에 될 때 가장 우선으로 자신이 링킹될 때 참고한 DLL을 side by side에서 선택합니다. 맞지 않는 DLL을 참고할경우 윈도 제어판 이벤트로그에 워닝이 남습니다.
이번 VS2008에서 side by side정보가 변경되었습니다. 따라서, dll 파일을 같이 배포해 주셔야 맞습니다.
재배포 패키지를 찾아서 배포해 주셔도 되고, 디펜즈에 있는 DLL 파일들을 복사해서 같이 복사해 주셔도 됩니다. 편한 방법을 선택하시면 됩니다.
Dependency Walker 사용법
http://notgivuphil.tistory.com/413
전에는 idasm (visual studio.net) 을 통해서 dll을 확인했었는데, dependency walker 라는 프로그램이 있다는 사실을 알고서 이에 대한 사용방법이 있기에 스크랩을 해본다.
하지만 봐도 잘 모르겠다는... ^^;
--------------------------------------
0 - Dependency Walker란?
쉽게 이야기해서 프로그래밍이 사용한 DLL 정보와 DLL에 들어있는 함수 중 사용한 함수를 보여주는 툴 (오~)
1- 프로그램위치 (VS 2005기준) – 편하게 아래쪽 그림 참고
2- 그럼 실행해보자 ^0^
(1) 연결된 DLL정보를 볼 프로그래밍을 선택하기 위해 아래 아이콘을 클릭한다.
(2) 연결된 DLL 정보를 볼 프로그래밍을 선택한다
< 참고로 난 안사람은 안다는 저 흐뭇한 게임의 속을 보려고 한다 *ㅡ_ ㅡ*(개인적취향에 존중을)>
자! 프로그래밍을 선택하고 열기를 누르자!
(3) 나온 화면
(4) 자 사용된 DLL과 그 DLL에서 사용된 함수를 봐보자!
딱 보니 이 흐뭇한 게임에 사용된 DX9 버전은 9_32 버전이라는 점과 함께 D3DXCreateEffect 사용된것 봐서 쉐이더 HLSL를 사용했다는 것이 보이군요 후후후
(5) 자 그럼 내 프로그래밍에서 사용된 DLL는 어디에?
파란색 네모에 있는 아이콘을 누르면 바로 DLL 있는 FullPaths 가 표시 된다.
(6) 기타
* 이외에도 여러 기능들이 있는 것 같으니 직접 한번 해보시길
* 이 Dependency Walker에 아쉬운점은 바로 아까 무시한 워닝을 출력하게 한 것처럼
MS나 공식적인 DLL가 아닌 사용자가 만든 DLL (ex, 게임엔진의 DLL)는 표씨 하지 않는다는 점이다. (어떻게 생각해보면 당연한 것 일수도 있다.) -> 응? 아닌데 나오던데?
(7) 끝으로 프로그램을 배포할 때 무슨 DLL이 사용되었고 어떤 DLL를 포함해야 할지 이 프로그램으로 먼저 파악하고
아래 같은 상황이 생겨 당황해 하지 않기 바란다..
'운영체제 & 병렬처리 > DLL_LIB' 카테고리의 다른 글
DLL 생성과 익스포트 섹션2 [두번째 방법 : __declspec(dllexport) 지시자 사용방법 ] (0) | 2012.11.01 |
---|---|
DLL 생성과 익스포트 섹션1 (0) | 2012.11.01 |
함수포인터와 DLL, 함수 포인터를 써야 하는 상황 (0) | 2012.11.01 |
static 변수,함수에서 접근할때 변수 초기위치와 DLL (0) | 2012.11.01 |
dllexport (0) | 2012.10.31 |