수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1620901
  • Today | 281
  • Yesterday | 482

Programming/MFC2007/03/21 10:14

Delayload 적용시키기

DelayLoadProfile.zip
원본 :
http://www.debuglab.com/knowledge/delayload.html

1.요약

Dll을 프로그램이 시작할 때 로드하는 것이 아니라, Dll을 처음으로 사용할 때 로드하도록 하는 방법을 알아봅니다.


2.본문

Visual C++ 6.0 Linker는 Delay Load 를 지원합니다.
기능은 요약에서 말씀드린 것과 같습니다.


[ 어떻게 사용하나? ]

사용법은 다음과 같습니다. Visual Studio 6.0 IDE가 따로 지원하는 UI는 없으므로 Project Settings > Link > Project Options 에디트 창에 이렇게 적습니다.

/DELAYLOAD:dllname.dll
그리고 DelayImp.lib 를 함께 링크해야합니다.(이유는 뒤에서 설명)


[ Delay Load는 언제 사용하나? ]

사용자가 프로그램을 더블클릭하고 나서 프로그램이 로드될때까지의 시간을 줄이는 것이 Delay Load의 가장 큰 역할이겠죠.

평소에는 잘 사용되지 안고 특별한 경우에만 사용되는 dll들을 찾으면 되겠죠..


[ 특별한 Dll은 어떻게 찾나? ]

함께올린 DelayLoadProfile 이라는 유틸을 사용해서 어플리케이션을 실행시키면 load된 dll과 해당 dll을 몇 번 사용했나.. 하는 통계가 나옵니다.

어플리케이션을 실행 시켰다가 그냥 끈 경우에, 한 번도 사용하지 않는 dll들은 Delay Load를 적용시킬 아주 좋은 후보가 되겠죠..

이 유틸리티를 제작한 Matt Pietrek 아저씨의 말에 따르면

SHELL32.DLL
WINSPOOL.DRV
OLE32.DLL
OLEAUT32.DLL

등이 유력한 후보라고 하네요..


[ 구현원리는 무엇인가? ]

오늘 함께 올린 팁을 보시면 import library를 통해서 로드되는 dll은 IAT(Import Address Table)에 실제 함수의 주소를 매핑시킨다고 나와있습니다.

DelayLoad가 적용되는 경우에는 실제 함수의 주소가 매핑되는 것이 아니라 스텁 코드가 매핑되는 것이죠..

스텁 코드가 하는 일은, 처음으로 함수 호출이 되었을 때, 실제 dll을 LoadLibrary를 통해서 로드하는 겁니다. 물론 다음 번 호출부터는 이미 실제 함수가 매핑되어 있으므로 같은 과정을 거칠 필요가 없겠죠..

사용법에서 DelayImp.lib를 함께 링크해야한다고 말씀드렸습니다. 사실 스텁 코드는 delayimp.lib 에 있는 루틴을 호출하도록 되어있는 작은 코드일 뿐입니다.


3.예제


예제의 압축을 풀어보시면

DelayLoadProfile.exe
DelayLoadProfileDll.dll

이 들어있습니다.

DelayLoadProfile은 콘솔 프로그램이기때문에, 프로파일링 하고자하는 exe의 이름을 첫번째 인자로 주어서 실행시키시면 됩니다.

다음은 제가 ActiveTutor 3.0 을 프로파일링 한 결과 입니다.

c:\>DelayLoadProfile ATRecorder

DelayLoadProfile: 2Mathia.dll was called 0 times
DelayLoadProfile: 2EqnV.dll was called 0 times
DelayLoadProfile: SHLWAPI.dll was called 19 times
DelayLoadProfile: LTWVC11n.dll was called 6 times
DelayLoadProfile: MSVCRT.dll was called 219 times
DelayLoadProfile: USER32.dll was called 29650 times
DelayLoadProfile: GDI32.dll was called 8634 times
DelayLoadProfile: ADVAPI32.dll was called 28 times
DelayLoadProfile: SHELL32.dll was called 2 times
DelayLoadProfile: COMCTL32.dll was called 50 times
DelayLoadProfile: ole32.dll was called 2 times
DelayLoadProfile: OLEPRO32.DLL was called 0 times
DelayLoadProfile: OLEAUT32.dll was called 0 times
DelayLoadProfile: FC4CD.dll was called 4 times
DelayLoadProfile: WINMM.dll was called 12 times
DelayLoadProfile: MSACM32.dll was called 0 times
DelayLoadProfile: zlib.dll was called 0 times

DelayLoadProfile: BugslayerUtil.dll was called 0 times

AT 3.0을 실행시켰다가 아무것도 하지않고 바로 종료한 경우의 결과입니다.

AT 3.0 은 실행하는데 오래걸리는 덩치 큰 프로그램이 아니어서, 굳이 최적화할 필요는 없는 것 같습니다.

하지만 몇몇 dll 들은 한 번도 사용되지 않은 걸 알 수 있습니다.

해당 dll들에 delayload를 적용시킨다면 적으나마 효과를 볼 수 있겠죠.


4.참고

Under the HOOD, Matt Pietrek, Feb 2000 MSJ



- 2001.08.19 Smile Seo -
"MFC" 카테고리의 다른 글
  • WaitCursor가 만들어지지 않는 경우 (0)2007/03/22
  • Dll Rebase 시키기 (0)2007/03/21
  • Delayload 적용시키기 (0)2007/03/21
  • MFC 라이브러리에 동적으로 링크된 정규 DLL (0)2007/03/21
  • 대용량의 파일 순식간에 읽기 (0)2007/03/21
2007/03/21 10:14 2007/03/21 10:14
Posted by webdizen
Tags Delayload
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2719

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1 ... 519 520 521 522 523 524 525 526 527 ... 2998  Next»

RSS HanRSS
Blog Image
webdizen
이 곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (2998)
Webdizen (134)
Life (6)
Diary (16)
Blog (9)
IDEA (1)
Travel (10)
Book (14)
Photo (7)
Movie (7)
Music (13)
Leisure Sports (10)
Funny (5)
Hardware (119)
Software (120)
Windows (5)
Unix & Linux (119)
Installation (4)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (805)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (3)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (3)
Network (66)
Web (78)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • 삼보
  • 네이버
  • Audio
  • 포인터 변수
  • eyeOS
  • 투명한 비트맵
  • 조니워커 블루
  • 자료형
  • 후버댐
  • 웹 로그
  • hardware interrupt
  • 배열과 포인터
  • hacking
  • 백록관
  • 접속 로그
  • Hooking
  • 캐시
  • CAB
  • Event
  • fcntl

Recent Articles

  • ASCII Code의 CRLF 제거 방법.
  • Hadoop 에서 c++ API 이용시....
  • Ubuntu Linux에서 Hadoop 구....
  • 내 심장을 한껏 뛰게한 "국가....
  • 스타 스키마 데이터베이스 설....

Recent Comments

  • ■ 온라인카지노 ▶ http://L....
    asdf 11/21
  • 그리고 혹시 해외여행자보험....
    kim 11/05
  • ★★실제 바다게임장과 똑같....
    asdf 11/04
  • sbsyama.co.to← 짱5000만당....
    asdf 11/04
  • ♡KicaZ??o(???) 바카라사....
    fdsf3fass 11/03

Recent Trackbacks

  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 02/11
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007
  • 마방진을 구하는 프로그램.
    Oranzie's BLOG 3 2007

Archive

  • 2009/09 (3)
  • 2009/08 (1)
  • 2009/03 (1)
  • 2009/02 (9)
  • 2009/01 (13)

Calendar

«   2009/11   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.