파이썬 2.7 에서 디스어셈블러 모듈을 써보고 싶어서~ 

파이썬 전반적인 활용능력도 익힐겸(?) "libdasm" [ libdasm 사이트 ] 라이브러리 가져와

직접 "PyDasm" 모듈을 빌드하기로 결정했습니다.


그런데 이게 왠걸...? "vcvarsall.bat" 파일을 찾을 수 없다는 에러를 뱉으며 빌드가 되지 않더군요;;;


처음 시도시 PyDasm 빌드 실패



구글링을 하며 이런저런 정보를 뒤지다 보니~ 

Python 2.7 버전대는 Visual Studio 2008 을 기준으로 되어있다는 그런 글들이 많이 보이더군요..;;

제 PC 에는 Visual Studio 2010, Visual Studio 2013 Express ... 이렇게 설치가 되어있는데 말이죠;;;


근데 아무리 생각해도 저 에러는 "vcvarsall.bat" 파일만 제대로 찾으면 왠지 될거 같다는 생각에~

파이썬의 "Disutils" 라이브러리에서 "vcvarsall.bat" 를 찾는 부분을 뒤져봤습니다.

이것저것 뒤지다보니 MS Visual C++ 컴파일러 계열에 대해서 처리하는 방식이 눈에 들어오더군요.. @_@;;



C 컴파일러에 대한 기본 설정



"msvc" 의 경우는 "msvccompiler" 모듈의 "MSVCCompiler" 클래스를 사용하더군요~ :)


msvccompiler 모듈을 열어봤더니... 맨 마지막에 아래와 같은 내용이 있더군요.. @_@ ;;;


msvccompiler.py



get_build_version() 을 해서 8.0 이상이면 "msvc9compiler" 모듈의 "MSVCCompiler" 을 IMPORT~!!


get_build_version() 은 뭘까요..?? @_@ ;;


get_build_version()



코드 자체는 어려운 코드가 아닙니다.


저 코드 결과가 어떻게 되는지 파이썬 콘솔로 테스트 해볼까요..? :)


파이썬 콘솔 테스트


간단히 설명하면 sys.version 내에서 "MSC v." 문자열을 기준으로 그 뒤의 문자열을 찾아서~

majorVersion, minorVersion 을 계산하는 코드입니다.

( 특이한 점은 majorVersion 을 구할 때 15 에 6 을 빼서~ 9 를 구하는 점이랄까요..; )


다시 돌아가서 어쨌든 결과는 9.0 으로 8.0 보다 크기때문에~

"msvc9compiler" 모듈의 "MSVCCompiler" 클래스를 사용합니다.

"msvc9compiler" 모듈엔 대략 다음과 같은 코드들이 있습니다.


참조할 레지스트리 정보


vcvarsall.bat 경로 설정



드디어 "vcvarsall.bat" 파일 경로를 설정하는 부분을 찾았습니다.

Visual Studio 설치시 생성되는 레지스트리 정보를 읽어와서 경로를 지정하는군요~



[ 키포인트 ]


코드를 보면 아시겠지만 "version" 값에 따라 레지스트리 접근 경로가 달라지는데요...

"version" 값은 앞서 언급한 get_build_version() 으로 리턴되는 값을 말합니다.

"msvc9compiler" 모듈에도 get_build_version() 이 있는데~

여기서 majorVersion 연산하는 부분을 살짝 고쳐서 10.0 이 리턴되도록 하면~

Visual Studio 2010 의 레지스트리를 정상적으로 참고하면서 모듈 빌드도 정상적으로 됩니다~ :)


msvc9compiler.py 의 get_build_version()


Visual Studio 2012 나 2013 의 경우도 동일한 방식으로 majorVersion 부분을 고쳐서~

11.0, 12.0 이 리턴되도록 하면 해당 버전에 맞게 잘 된답니다... ^^;;;



마무리는 일단 기분좋게 빌드는 완료된 화면으로~ :))


majorVersion 수정 후 빌드 성공한 화면



ps... 환경변수만 살짝 건드려서 더 간단히 해결할수 있을지도 모른다는건 함정... =_=;;;;




YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. BlogIcon 진모씨 2014.01.23 03:24 신고  댓글주소  수정/삭제  댓글쓰기

    허걱.. 저는 그냥 VS100COMNTOOLS 환경변수를 VC90COMNTOOLS 환경변수로 지정해줬더니 되서..
    이런 방법도 있었군요, 감사합니다.

    • BlogIcon XeroNic(HS) 2014.01.23 12:11 신고  댓글주소  수정/삭제

      저는 개인적인 호기심 차원에서~
      파이썬에서 어떻게 C/C++ 컴파일러를 호출하는지 보다보니...
      이런 식의 흐름이 파악이 되더라구요~ :)

      외부에 영향을 미칠 수 있는 환경변수를 건드리지 않고~
      파이썬 내부에서 해결하는게 더 깔끔할것 같아서~ :)
      요런 것도 포스팅을 하게 되었네요~ㅎㅎ

  2. Lsick 2015.12.11 11:12  댓글주소  수정/삭제  댓글쓰기

    사용하시는 소스분석 툴 이름이 뭔가요 ?