[Operating System] Window에서 DLL 검색 순서

임수정·2024년 7월 3일
0

📝 Learning Log

목록 보기
21/47
post-thumbnail

📍 DLL 검색 순서

현재 작업 디렉토리(Current Working Directory) : 먼저 프로그램이 실행되는 디렉토리에서 DLL 파일을 검색한다. 이는 가장 먼저 검색되는 위치로, 프로그램 실행 파일과 같은 디렉토리에 DLL 파일이 위치할 경우 이곳에 로드

시스템 디렉토리(System Directory) : 시스템이 설치된 디렉토리(예: C:\Windows\System32)에 위치한 DLL 파일을 검색한다. 시스템 디렉토리는 시스템 환경 변수인 %SystemRoot%의 하위 디렉토리

PATH 환경 변수에 지정된 디렉토리들 : PATH 환경 변수에 설정된 디렉토리들을 순서대로 검색한다. 이 디렉토리들은 시스템 환경 설정에서 사용자가 지정할 수 있으며, 여기에 위치한 DLL 파일들도 검색됨

레지스트리(Registry) : Windows 레지스트리에 등록된 DLL 검색 경로를 확인한다. 예를 들어, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths 레지스트리 키에 등록된 경로들이 여기에 해당

이 순서대로 DLL 파일이 검색되며, 같은 이름의 DLL 파일이 여러 경로에 존재할 경우에는 검색 우선순위에 따라 먼저 발견된 경로의 DLL 파일이 로드

검색 경로 : 시스템의 DLL 검색 순서는 Safe DLL 검색 모드의 활성 여부에 따라 달라진다. Safe DLL 검색 모드는 사용자의 현재 디렉토리의 검색 순서를 뒤쪽으로 변경한다. Safe DLL 검색 모드는 default로 활성화 되어있다. 이를 비활성화 하기 위해서는 레지스트리의 값을 0으로 설정해야한다. SetDllDirectory 함수로도 검색 경로에 특정 디렉토리가 있는 동안 Safe DLL 검색 모드를 비활성화 할 수 있다.

Safe DLL 검색 모드
Windows 운영 체제에서 DLL 파일을 로드할 때 발생할 수 있는 보안 문제를 완화하기 위해 도입된 기능

📖 Safe DLL 검색 모드 활성화 시 검색 순서

  1. 애플리케이션이 로드된 경로
  2. 시스템 디렉토리(GetSystemDirectory 함수로 얻은 경로)
  3. 16-bit 시스템 디렉토리(함수로는 경로를 얻을 수 없지만 검색순서에 포함됨)
  4. Windows 경로(GetWindowsDirectory 함수로 얻은 경로)
  5. 현재 경로
  6. 환경변수 PATH에 존재하는 경로

📖 Safe DLL 검색 모드 비활성화 시 검색 순서

  1. 애플리케이션이 로드된 경로
  2. 현재 경로
  3. 시스템 디렉토리(GetSystemDirectory 함수로 얻은 경로)
  4. 16-bit 시스템 디렉토리(함수로는 경로를 얻을 수 없지만 검색순서에 포함됨)
  5. Windows 경로(GetWindowsDirectory 함수로 얻은 경로)
  6. 환경변수 PATH에 존재하는 경로

📍 DLL 검색에 영향을 주는 요소들

  • 만약 메모리에 동일한 이름의 DLL이 로드되어 있을 경우 시스템은 리다이렉션과 manifest만 확인하고 DLL을 검색하지 않는다.

리다이렉션(Redirection)

  • DLL 리다이렉션은 특정 버전의 DLL을 요청하는 경우 시스템이 다른 버전의 DLL을 제공하는 매커니즘이다.
  • 예를들어, 어떤 응용 프로그램이 특정 DLL 버전을 요구하면, 시스템은 요청된 DLL 버전이 없더라도 호환되는 다른 버전의 DLL을 제공할 수 있다. 이는 애플리케이션이 올바르게 작동할 수 있도록 보장하는 기능

Manifest 파일

  • .manifest 파일은 응용 프로그램이나 DLL과 관련된 추가 정보를 포함하는 XML 파일이다.
  • 주요 목적은 다양한 버전의 DLL이나 리소스를 관리하고, 실행 환경 설정을 지정하는 것이다.
  • 예를 들어, .manifest 파일은 어플리케이션이 특정 DLL 버전을 사용하도록 요구하거나, 다른 리소스 파일을 포함하는 등의 정보를 담을 수 있다.
  • 만약 애플리케이션이 실행중인 윈도우의 Known-DLL 목록에 포함되어있는 DLL을 로드할 경우 시스템은 DLL을 검색하지 않고 Known-DLL의 복사본을 사용한다. 현재 시스템의 Known-DLL 목록은 다음 레지스트리 경로에서 확인 가능

Known-DLL List

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

📍 DLL지옥(DLL Hell)

DLL 검색 순서는 보통 개발자가 의도하는 대로 DLL을 로드하게끔 설계되어 있다. 그러나 때로는 여러 경로에 동일한 이름의 DLL이 존재하거나, 버전이 충돌할 경우 문제가 발생할 수 있다. 이를 DLL 지옥(DLL Hell)이라고 한다. DLL 지옥은 다양한 버전의 DLL이 설치되어 있어서 각각의 어플리케이션이 필요한 DLL 버전을 올바르게 찾지 못하고 충돌이 발생하는 상황을 의미

의존성 충돌 : 프로그램이 실행될 때 필요한 DLL 파일을 찾지 못하거나, 버전이 맞지 않는 DLL 파일을 로드할때 발생

로딩 순서 문제 : 여러 경로에 같은 이름의 DLL 파일이 존재할 때, 우연히 다른 버전의 DLL 파일이 로드되어 예상치 못한 동작이 발생할 가능성 있음

환경 변수 설정 오류 : PATH 환경 변수 설정이 잘못되어 원치 않는 DLL 파일이 로드되거나, 시스템 디렉토리에 적절하지 않은 DLL 파일이 위치할 경우 문제가 발생

profile
언어는 거들 뿐...

0개의 댓글