역시 Mingw와 WINE은 대단했다

목요일 논술 신문크리 과기특 시험크리, 금요일 언어학개론과 디지털시스템 과제크리가 이중으로 터져 주면서 낮과 밤이 완벽하게 뒤바뀌었다. 금요일 디지털시스템 과제크리가 끝났으리라고 생각하면서 자러 가는 채비를 하는데 어째 뭔가 뒤가 구리다. 알고 보니 전자과 프로그래밍 마지막 과제를 안 끝냈다.

마지막 두 시간에 교수님께서 네트워크 프로그래밍 맛배기라고 쓰고, 소켓을 만들고 채팅 서버를 구현하기까지 강의하였다. 채팅 서버와 클라이언트를 직접 타이핑해 보고 그 결과를 스크린샷으로 찍어서 제출하면 된다. 하필 이 과제를 이야기했던 목요일 아침 수업 시간에 전날 무리하게 달렸던 논술 신문 때문에 반쯤 비몽사몽인 상태로 들어서 기억이 뚝뚝 끊겨 있지만, 그나마 강의 노트를 보면서 끊긴 기억을 복원할 수 있었다.

그런데 아뿔싸. 지금까지 내 줬던 과제는 리눅스에서도 잘만 돌았는데 맨 마지막 과제는 대놓고 Winsock 아닌가. 아 근처에 윈도가 깔려 있는 물리적 컴퓨터가 두 대나 있지만, 두 컴퓨터 모두 컴파일러를 깔기에는 역부족이다. 하나는 내 옆에 있지만 채 1GHz도 안 되는 CPU가 달려 있고, 다른 하나는 비 오는 날 밤에 나가기에는 귀찮은 곳에 있다. 일단 코드부터 다 짜면 무언가 떨어질 거라고 생각해서 코드부터 무작정 짰다.

이쯤에서 프리젠테이션의 맨 마지막 부분을 인용해 보자.

ⓒ 2009 김탁곤 교수님

마지막 강의자료 중 일부, ⓒ 2009 김탁곤 교수님

내 컴퓨터에는 만약을 대비해서 리눅스용 mingw32와 WINE이 깔려 있다. mingw의 일부분으로 ws2_32가 있으리라고 생각하는데 이게 mingw 패키지에 딸려 나온건지, 아니면 따로 깔 게 있는지 궁금해서 찾아봤다. 찾아 봐도 별 신통찮은 말밖에는 없어서 일단 mingw로 컴파일할 때 무작정 저 링크 옵션을 추가해 봤다. 가랏 i586-mingw32msvc-gcc. 결과는 어찌 되었든 성공. 링크가 되었다는 뜻이다.

결과물로 튀어나온 파일은 깔끔하게 exe 확장자도 붙어 있고, +x 권한도 걸려 있었다. 자 이제 리눅스에서 실행하듯이 파일을 실행하면 된다. 충분히 최신 배포판을 쓰고 WINE도 깔려 있다면 리눅스용 프로그램을 실행하듯 윈도용 프로그램도 실행 가능하다. 이건 리눅스 커널의 binfmt_misc 덕택이다. binfmt_misc는 커널 모듈로 존재하며, 실행 파일을 던져 주었을 때 미리 지정한 인터프리터로 실행시킬 수 있는 기능이다. WINE 역시 binfmt_misc에 등록할 수 있으며, 이 때 PE 파일의 첫 두 문자 “MZ”를 자동으로 감지한다.

WINE이 내 시스템을 망칠 리는 없고, 어차피 내가 소스를 아는 프로그램이기 때문에 과감히 클라이언트와 서버를 실행시켜 보았다. 결과는? 리눅스 프로그램과 별반 차이를 느낄 수 없었다.

가라 타이푼... 이 아니라 가라 WINE!

가라 타이푼... 이 아니라 가라 WINE!

왼쪽이 서버, 오른쪽이 클라이언트다. 실행시킨 방법에서 보이듯 저건 리눅스 맞다. exe 파일 확장자로 보면 윈도용 실행 파일 맞다. WINE의 발전한 모습을 보고 감격할만한 순간이었다. (사실 현재 WINE은 어지간한 간단한 윈도 프로그램은 100% 재현 가능하다. PE 파일을 실행시키는 기능은 다 끝났는데 크고 아름다운 윈도 API가 발목을 잡고 있을 뿐이다.)