인프런 커뮤니티 질문&답변

청파동빠루님의 프로필 이미지
청파동빠루

작성한 질문수

Windows 시스템 프로그래밍 - 기본

강사님 dll 지연로딩 관련하여 질문 드립니다

해결된 질문

작성

·

72

·

수정됨

0

강의 내용을 기반으로 제프리 리처 <Windows via C/C++> 을 읽으며 생긴 질문이 있어서 여쭤봅니다.

5판 번역본 기준 730p 입니다.

 

/DelayLoad:MyDll.dll <- 지연로딩할 dll

을 사용하면 링커에게 "실행 모듈의 임포트 섹션으로부터 MyDll.dll 파일을 제거하여 프로세스를 초기화할 때 해당 DLL 을 암시적으로 로드하지 못하도록 한다. 라고 되어 있습니다. (730페이지 상단)

 

이후에 지연로드 된 함수가 호출되었을 때 해당 함수를 익스포트하고 있는 DLL 이 존재하지 않으면 __delayLoadHelper2() 는 exception 을 던진다고 나와있습니다. (730페이지 3번째 문단)

 

궁금한 점은 "임포트 섹션에서 MyDll.dll 제거할 때 해당하는 dll 이 없으면 링크타임이나 로드할 때 에러를 발생시키면 되는데 왜 굳이 런타임에 exception 을 던지는지?" 궁금합니다.

 

항상 유익한 강의 감사합니다 😄

답변 2

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

질문이 '지연로딩 그 자체가 필요한 이유는 무엇인가?' 라고 이해했습니다. DLL이든 exe 실행모듈이든 윈도우 환경에서 이런 파일들은 기본적으로 PE format입니다. 그리고 이 PE 파일은 각종 Section들로 구성됩니다. PE파일을 OS가 로드하면 여러 절차를 거쳐 실행 코드에 대해 연산을 시작하지만 그 전에 의존성이 있는 라이브러리(DLL)들을 로드합니다. 그래야 exe 파일이 정상적으로 실행될 수 있기 때문입니다.

만일 내가 작성한 프로그램이 Hello world를 printf() 함수 하나로 출력하는 짧은 코드라 하더라도 printf() 함수를 비롯해 모든 C-runtime 라이브러리가 포함된 DLL을 로드합니다. PE import section에 해당 라이브러리가 기술되어 있기 때문입니다.

참고로 링크타임에 로드하는 경우는 DLL 묵시적 로딩의 경우 이미 그렇게 작동합니다. 같은 원리로 명시적 로딩을 시도할 경우 런타임 오류가 발생할 수 있습니다. 그리고 그러한 오류에 대비해 코드를 작성하는 것은 명시적 로딩을 시도하는 모든 개발자에게 주어진 숙제라 하겠습니다.

지연 로딩을 하는 이유는 같은 730페이지에 잘 기술되어 있으니 확인해보시기 바랍니다. 결과적으로 굳이 런타임에 예외가 발생하는 이유는 런타임에 특정 DLL이 제공하는 함수가 호출될 수 있기 때문입니다. 지연 로딩은 라이브러리 로딩 시점을 프로세스 생성이 아니라 작동 과정으로 미뤄둔 것입니다. 참고하시기 바랍니다. 😄

0

안녕하세요, 인프런 AI 인턴입니다.

님의 질문에 대한 답변은 주어진 정보에 포함되어 있지 않습니다. 제공된 정보는 Spring Boot와 관련된 문서 정보와 인프런에서 강의에 대한 궁금증을 문의할 수 있는 방법에 관한 것입니다. Windows 시스템 프로그래밍이나 dll 지연로딩에 대한 구체적인 내용은 포함되어 있지 않아, 질문에 직접적으로 답변할 수 없음을 양해 부탁드립니다.

다른 프로그래밍 관련 질문이 있으시면 도와드리겠습니다!

청파동빠루님의 프로필 이미지
청파동빠루

작성한 질문수

질문하기