포스팅 계기
이번 글은 내가 정말 고생해서 해결한 LoadLibrary 관련 오류를 기록해 두고자 작성하게 되었다. 어느 날 평소처럼 LoadLibrary(_T("특정. dll"))을 호출했는데, 특정 PC에서만 NULL을 반환하는 문제가 발생했다. GetLastError()로 확인해 보니 193 (ERROR_BAD_EXE_FORMAT)이라는 낯선 값이 나왔고, 처음엔 단순히 비트 수 불일치 문제인가 했지만… 디버깅은 생각보다 훨씬 깊고 길었다. 혹시 이 글을 보고 계신 분도 비슷한 상황이라면, 제 경험이 힌트가 되기를 바란다. ( 이 글을 읽고 나처럼 많은 시간을 투자하지 않고 해결할 수 있기를 바란다.)
LoadLibrary가 NULL을 반환하는 주요 케이스
LoadLibrary()는 DLL을 로딩할 수 없을 때 NULL을 반환하고, 그 원인을 알기 위해서는 꼭 GetLastError()로 에러 코드를 확인해야 한다. 내가 이번에 확인했던 주요 실패 케이스는 아래와 같다.
📌 1) DLL 경로 오류
- 잘못된 상대 경로, 누락된 파일, 확장자 오타 등
📌 2) 비트 수 불일치 (ERROR_BAD_EXE_FORMAT, 코드 193)
- EXE가 64bit인데 DLL이 32bit (또는 그 반대)
✨ 3) 종속 DLL 누락 or 훼손 ( 내가 해결한 방법 )
- tngcore2.dll 내부에서 사용하는 다른 DLL이 함께 로드되지 않음
- 이 경우 외형상 tngcore2.dll이 문제처럼 보이지만, 사실은 내부 참조가 문제
📌 4) DLL 내부 DllMain()에서 예외 발생
- 예외를 던지거나 return FALSE 시 LoadLibrary()는 NULL 반환
- 내부에 DllMain에서 특정 환경 조건을 검사하는 코드가 존재 ( 실무에서는 가끔 나오는 실수다. 이에 따라 특정 PC에서는 안되는 현상이 존재하기도 한다. )
📌 5) 보안 정책 / Windows Defender 차단
- 다운로드 받은 DLL이 차단
- 시스템 설정이나 보안 프로그램이 로드를 막는 경우
내가 해결한 방법
✅ 1) GetLastError() 확인 → 193 에러
→ 비트 수 확인을 가장 먼저 진행: dumpbin /headers로 DLL과 EXE 둘 다 x64 확인하였지만 일치하는 것을 확인
✨ 2) 종속 DLL 누락 or 훼손 여부 확인
→ DependenciesGui.exe를 사용해 확인했지만, 종속 DLL이 모두 있는 것처럼 보였지만 이상한 형태를 확인 → 집중분석 진행
✅ 3) LoadLibraryEx + SetDefaultDllDirectories() 적용
→ 보안 검색 경로 문제를 의심하고 절대 경로 + 안전한 플래그로 로딩 시도했지만, 여전히 193 에러 발생
✅ 4) 드디어 의심: DllMain() 내부 실패?
→ ERROR_BAD_EXE_FORMAT인데 DLL과 경로 문제가 아니라면, DllMain()에서 조건 불충족 or 예외일 확률이 높음 → 하지만 아니였음
✅ 5) 결론 : 종속 DLL 훼손
🔍 DependenciesGui프로그램을 활영하여 dll 종속성 여부를 확인하였다. 해당 프로그램 설치 및 사용방법은 따로 포스팅하도록 하겠다. 아래와 같이 내 PC에 있는 dll을 열면 종속성 있는 dll이 모두 전시가 되게 된다.
🔍 그다음에 Expand All을 누르면 세부 항목을 모두 확인할 수 있다.
🔍 확장에서 보면 아래와 같이 이상이 있는 dll은 아이콘이 다르게 표시가 된다. 그러면 그 dll을 새로 다운로드하여주면 문제없이 프로그램이 실행된다.
🎯 포스팅 마무리
LoadLibrary()는 정말 자주 쓰이는 함수지만, 실패했을 때의 디버깅은 생각보다 어렵고 복잡하다. 특히 ERROR_BAD_EXE_FORMAT(193)은 단순한 비트 수 불일치 외에도, 내부 예외, 종속 DLL 실패, 보안 정책 등 다양한 원인이 숨어있을 수 있다. 이번 경험을 통해 느낀 건, 안정적으로 보이는 코드일수록 실패했을 때의 디버깅 대비가 필요하다는 것이다. 혹시 나처럼 헤매고 계신 사람이 있다면, 이 글이 작은 등불이 되었으면 한다.
'C++ 개발이야기 > 문제 해결' 카테고리의 다른 글
프로그램 실행 중 - Stack overflow Dead( 0xC00000FD ) (1) | 2023.12.07 |
---|