파이썬 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... 환경변수만 살짝 건드려서 더 간단히 해결할수 있을지도 모른다는건 함정... =_=;;;;




저작자 표시 비영리 변경 금지
신고