원본 : http://www.debuglab.com/knowledge/dllreabase.html
1.요약
Dll들에게 적당한 로딩 주소를 할당함으로써 충돌을 막는 방법을 알아봅니다.
2.본문
[ Dll Rebase란 무엇인가? ]
Dll Rebase란 말 그대로 Dll의 로딩 주소를 새로 설정한다는 말입니다.
[ 왜 새로 설정하는가? ]
이전 팁에서도 말씀드렸지만, dll은 exe와는 달리, 자신이 원하는 주소에 로드된다는 보장을 받을 수 없습니다.
자신이 선호하는 주소에 이미 다른 dll이 자리잡고 있다면 싫더라도 다른 주소를 찾아서 입주해야겠죠..
이 과정에서 어느 정도의 오버헤드가 발생한다는 점은 쉽게 예측할 수 있습니다.
기본적으로 위저드를 사용해 만든 Dll은 Visual Basic의 경우 0x11000000, Visual C++의 경우 0x10000000 에 로드되도록 설정되어있습니다.
John Robbins 아저씨는 그의 책에서 다음과 같은 말을 합니다.
"세상에 있는 dll 중에 절반은 0x10000000에 로드되려고 할 겁니다.."
이를 다시 번역하면 이렇게 되겠죠..
'세상에 있는 dll 중에 절반은 실행될때마다 새 주소를 찾느라 시간을 소비해야 합니다.."
[ 어떻게 rebase 시키는가? ]
크게 두 가지 방법이 있습니다.
1. Rebase.exe 유틸리티 사용하기.
동봉한 zip 파일에는 Rebase.exe가 들어있습니다.
Visual Studio나 Platform SDK를 설치하셔도 구하실 수 있구요..
Rebase를 사용하는 방법은 매우 간단합니다. 원하는 주소와 dll의 이름만 넘겨주면 되죠..
문제는 주소를 어떻게 배분해야 dll들이 싸우지 않고 잘 로드될 것인가 하는 점입니다.
이 점에 대해서는 John Robbins 아저씨의 제안을 받아들이기로 합니다.
바로 알파벳 순서로 주소를 나누는 거죠.
예를 들어서, APPLE.DLL, DUMPLING.DLL GINGER.DLL, GOOSERBERRIES.DLL 있다고 치고.. 위의 방법을 따른다면..
만약 그렇다면 모든 dll을 한 번에 넣어주는 것도 좋겠죠.
하지만 dll 들이 너무 가까이 붙어있게되면 충돌이 일어나는 경우가 있다고 하네요.
그래서 마지막 줄은 다음과 같이 하는 것이 더 좋겠죠
2. LINKER의 /BASE 옵션 사용하기
Project Setting 에서 Base Address 에디트 창에 값을 넣으시면 됩니다.
[ 정말 효과 만점인가? ]
역시나 마땅한 예제가 없어서. Active Tutor Recorder 3.0 을 가지고 실험을 해봤습니다.
AT 3.0 이 수많은 dll을 가지고 있다거나, 로딩 시간이 느린 어플리케이션이 아니므로 가시적인 효과는 느낄 수 없었습니다.
하지만.. 시작해서 빈 문서를 만들기까지 조사해본 결과로는 Page Fault가 약 100번 가량 줄어들었고(원래 2850 번 정도에서) 사용한 메모리도 약 500kb 정도 줄었습니다.(원래 9Mb에서)
3.예제
4.참고
Debugging Application, John Robbins ch2 Getting Started Debugging
- 2001.08.19 Smile Seo -
1.요약
Dll들에게 적당한 로딩 주소를 할당함으로써 충돌을 막는 방법을 알아봅니다.
2.본문
[ Dll Rebase란 무엇인가? ]
Dll Rebase란 말 그대로 Dll의 로딩 주소를 새로 설정한다는 말입니다.
[ 왜 새로 설정하는가? ]
이전 팁에서도 말씀드렸지만, dll은 exe와는 달리, 자신이 원하는 주소에 로드된다는 보장을 받을 수 없습니다.
자신이 선호하는 주소에 이미 다른 dll이 자리잡고 있다면 싫더라도 다른 주소를 찾아서 입주해야겠죠..
이 과정에서 어느 정도의 오버헤드가 발생한다는 점은 쉽게 예측할 수 있습니다.
기본적으로 위저드를 사용해 만든 Dll은 Visual Basic의 경우 0x11000000, Visual C++의 경우 0x10000000 에 로드되도록 설정되어있습니다.
John Robbins 아저씨는 그의 책에서 다음과 같은 말을 합니다.
"세상에 있는 dll 중에 절반은 0x10000000에 로드되려고 할 겁니다.."
이를 다시 번역하면 이렇게 되겠죠..
'세상에 있는 dll 중에 절반은 실행될때마다 새 주소를 찾느라 시간을 소비해야 합니다.."
[ 어떻게 rebase 시키는가? ]
크게 두 가지 방법이 있습니다.
1. Rebase.exe 유틸리티 사용하기.
동봉한 zip 파일에는 Rebase.exe가 들어있습니다.
Visual Studio나 Platform SDK를 설치하셔도 구하실 수 있구요..
Rebase를 사용하는 방법은 매우 간단합니다. 원하는 주소와 dll의 이름만 넘겨주면 되죠..
문제는 주소를 어떻게 배분해야 dll들이 싸우지 않고 잘 로드될 것인가 하는 점입니다.
이 점에 대해서는 John Robbins 아저씨의 제안을 받아들이기로 합니다.
바로 알파벳 순서로 주소를 나누는 거죠.
<< Dll First Letter >> << Starting Address >>
A-C 0x60000000
D-F 0x61000000
G-I 0x62000000
J-L 0x63000000
M-O 0x64000000
P-R 0x65000000
S-U 0x66000000
V-X 0x67000000
Y-Z 0x68000000
dll 이름이 앞글자에 따라서 주소를 배분하는 방법입니다. 예를 들어서, APPLE.DLL, DUMPLING.DLL GINGER.DLL, GOOSERBERRIES.DLL 있다고 치고.. 위의 방법을 따른다면..
REBASE /b 0x60000000 APPLE.DLL REBASE /b 0x61000000 DUMPLING.DLL REBASE /b 0x62000000 GINGER.DLL GOOSEBERRIES.DLL마지막 줄처럼 DLL 을 여러 개 넣어주면, REBASE.EXE 는 영리하게 BASE 주소를 바꿔줍니다.
만약 그렇다면 모든 dll을 한 번에 넣어주는 것도 좋겠죠.
하지만 dll 들이 너무 가까이 붙어있게되면 충돌이 일어나는 경우가 있다고 하네요.
그래서 마지막 줄은 다음과 같이 하는 것이 더 좋겠죠
REBASE /b 0x62000000 GINGER.DLL REBASE /b 0x62100000 GOOSEBERRIES.DLL
2. LINKER의 /BASE 옵션 사용하기
Project Setting 에서 Base Address 에디트 창에 값을 넣으시면 됩니다.
[ 정말 효과 만점인가? ]
역시나 마땅한 예제가 없어서. Active Tutor Recorder 3.0 을 가지고 실험을 해봤습니다.
AT 3.0 이 수많은 dll을 가지고 있다거나, 로딩 시간이 느린 어플리케이션이 아니므로 가시적인 효과는 느낄 수 없었습니다.
하지만.. 시작해서 빈 문서를 만들기까지 조사해본 결과로는 Page Fault가 약 100번 가량 줄어들었고(원래 2850 번 정도에서) 사용한 메모리도 약 500kb 정도 줄었습니다.(원래 9Mb에서)
3.예제
4.참고
Debugging Application, John Robbins ch2 Getting Started Debugging
- 2001.08.19 Smile Seo -
"MFC" 카테고리의 다른 글
- DECLARE_DYNCREATE()와 IMPLEMENT_DYNCREATE() (0)2007/03/22
- WaitCursor가 만들어지지 않는 경우 (0)2007/03/22
- Dll Rebase 시키기 (0)2007/03/21
- Delayload 적용시키기 (0)2007/03/21
- MFC 라이브러리에 동적으로 링크된 정규 DLL (0)2007/03/21
Tags Dll Rebase

수안이의 컴퓨터 연구실



Leave your greetings.