수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1694441
  • Today | 186
  • Yesterday | 606

1 Articles, Search for 'Delayload'

  1. 2007/03/21 Delayload 적용시키기
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  Next»

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

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
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 (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
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

  • 시맨틱 웹
  • 공유 객체
  • Accessiblity
  • VSTO
  • UI
  • 인덱스 재생성
  • JDOM
  • 화면 캡처
  • FlashWindow
  • SQL Server
  • 구글수표
  • SYN flooding
  • YouOS
  • 보안백업
  • 데이터 정렬
  • 콘텐츠
  • 평점
  • font
  • Portable Executable
  • memory 크기

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 학교 과제물중 쓰레드에 대하....
    장진혁 03/17
  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • Lots of students know techn....
    Bobbi35Shannon 02/25
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  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 31      

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.