32비트로 컴파일된 DLL은 원래 64비트 프로그램에서 호출하지 못합니까?

조회수 9420회

C언어, 비쥬얼스튜디오 2017을 통해서 DLL을 작성하였습니다. x86으로 만들고, 그럭저럭 잘 다른 C 프로젝트에 얹히는데 문제 없습니다.

이걸 ctypes를 이용해서 파이썬에서 호출하려 하는데, 자꾸.... 뻗습니다?

에러 메세지가 이상하게 깨져서 보여드릴수도 없는데, 잠깐 생각하다 보니

파이썬 버젼이 64비트 용이고,

DLL이란 것은 "이미 컴파일 된 구간"을 통째로 가져오는 것이니,

그렇다면 x64의 흐름에서 x86의 흐름으로 갑자기 점프 한다는 것은 애초에 논리적으로 무리이니까, 파이썬 뿐만 아니라 모든 프로그램들이 자신과 다른 비트 수의 dll을 사용할 수 없....다고 보면 또 너무 나가는 것 같은데....

여기에 관해서 고수분들의 견해 부탁드립니다.

비트수와 무관하게 DLL을 호출할 수 있습니까? 아니면 아키텍쳐가 동일해야만 DLL 호출이 가능한지요?

  • 일단 C로 동일한 프로그램을 만들어서 호출하는 프로그램과 dll의 버전을 달리 하니까, 다르면 무조건 뻗는 것으로 보아, 맞는 거 같기도 한데요;;;; 광자 2018.1.16 18:14
  • x64는 x86의 확장이니깐. x64에서 x86을 읽는건 괜찮지만, 그 반대는 오류를 불러오지 않나요? dbwodlf3 2018.1.16 18:44
  • 안됩니다. 동일한 아키텍쳐로 컴파일된 dll 이어야 합니다. 정영훈 2018.1.16 19:22
  • 왜 안되는지 간략하게 설명만 좀 해주시면 채택할게요; 지우기는 질문이 아깝고 뭐든 채택은 해야겠으니;;; 광자 2018.1.18 11:00

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    먼저 간략하게 설명할 수 있는 주제는 아닙니다.

    확장자 exe, dll, sys 라는 것을 PE file 이라고 부르며 x86 윈도우에서는 PE 라고 하고 X64 윈도우에서는 PE+ 혹은 PE32+ 이라고 합니다.

    명칭이 다른 만큼 둘은 호환이 안됩니다. 즉 32비트는 32비트끼리 64비트는 64비트끼리 사용할 수 있습니다.

    dll을 로드하면 물리메모리에 1번 등록이 되고 프로세스의 가상주소에 맵핑이 되는 구조입니다.

    즉 여러 프로세스가 같은 dll을 로드해도 물리메모리에는 1번만 로드되고 각 프로세스의 가상메모리 주소에 맵핑만 됩니다. 유저모드에서는 절대 물리메모리(커널메모리)에 직접 핸들링 할 수 없습니다. (그런데 이번에 CPU 취약점으로 그것이 가능해졌죠)

    여기서 중요한 것은 우리가 사용하는 exe라는 파일은 format을 가지고 있다는 겁니다. exe가 호출할 dll과 펑션주소를 IAT(Import Address Table)라는 구조로 저장을 하고 있습니다.(이 주소 크기가 32비트 64비트가 다르게 됩니다.)

    자 여기서 프로세스가 32비트 주소 공간을 가지고 있는데 64비트 주소공간을 가진 dll은 당연히 로드를 못합니다. 반대도 마찬가집니다.

    PE file 에 대한 공부를 하시면 많은 부분 이해가 되실겁니다. IAT에 집중해서 PE32+ format 을 학습을 해보세요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)