원래 Windows 환경에서 사용할 만한 컴파일러와 IDE 에 대한 이야기를 쓰려다가,

msys 에서 아래와 같은 에러가 발생하여, 여기에 대한 내용부터 기록에 남긴다.


*** Couldn't reserve space for cygwin's heap (0xXXXXXXXX <0xXXXXXXX>) in child, Win32 error 0


집에서는 잘 되는데, 회사에선 항상 저런 메시지를 내면서 msys 의 대부분의 실행 파일들이 동작하지 않는다.


간단하게 결론부터 말하면 child process 가 fork() 될 때,

dll 파일이 로드되는 메모리 주소가 서로 다르게 되어 fork() 가 실패하기 때문이다.

( 이게 무슨 말이냐 라고 묻는다면, 납득할 만하게 설명할 자신은 없다. -_-;;

  좀 더 자세한 설명을 원한다면 아래 포스트를 읽어보라.

  http://old.nabble.com/Re%3A-fork-problem-on-Windows-XP-64-bit-p31154393.html )

( 예전에는 cygwin 에서도 이러한 에러 메시지를 본 기억이 있는데,

  최근에는 cygwin setup 시에 dll 파일들의 base address 를 재설정 한다고 하는 듯하다. )


이리저리 구글링 좀 해 본 결과, 아직까지 근본적인 해결방법은 없는듯 한데,

실제로 msys 의 릴리즈 노트를 봐도 저 문제를 해결하지는 못하고

다만 rebase 되는 상황을 최소화 하기 위해 msys-1.0.dll 파일의 base address 를 바꾸었다고 되어있다.

( 분명 Windows 는 dll 파일을 로드할 때, 주소 충돌이 생기면 base address 를 알아서 조정한다고 했던거 같은데, 

 왜 msys 에서는 안되는지 잘 모르겠다. dll 파일 자체에 해당 기능을 enable 하는 플래그가 있다고 본 거 같다.

 하지만 더 구체적인 근거를 찾기엔 시간도 부족하고... 해서 패스 )


어쨌든 저러한 문제가 생기면 msys 에 포함된 dll 파일들의 base address 를 바꾸어 주어야 하는데,

이 때 사용하는 프로그램이 rebase 프로그램이다.

문제는 msys 에 포함된 rebase 를 실행하기 위해서는 msys-1.0.dll 이 필요하다는 거.

그래서 msys-1.0.dll 이 의존적이지 않는, Win32 native binary 가 필요한데,

직접 빌드하려 소스를 열어보니 익숙치 않은 autoconf, automake 조합으로 빌드되도록 되어있다.

하지만 나와 같은 (그리고 이런 문제를 만난 다른 많은 사람들과 같은) 생각을 가진 분이

이미 빌드해 놓은 파일이 있었다.


소스: http://repo.or.cz/w/msysgit.git/tree/322c42c780833a52bd7cd0358a562ab243ecfbce:/src/rebase

바이너리: http://repo.or.cz/w/msysgit.git/history/76920dc49da361257cbccb02ea63b3e5357fe353:/bin/rebase.exe


위 툴을 받아, msys 의 bin 디렉토리에 복사를 한다. (보통 C:\MinGW\msys\1.0\bin 일 것이다.)

그리고 해당 디렉토리에서 cmd 창을 열고 아래와 같이 입력한다.

C:\MinGW\msys\1.0\bin>rebase -b 0x30000000 msys-1.0.dll

새로운 Base 주소는 각자 적당히 찾아서 적으면 될듯 하다.

그리고 이제 다른 dll 파일들에 대하여 rebase 작업을 한다.

이제 MinGW Shell 을 열어도 에러가 뜨지 않으니, MinGW Shell 을 열고,

$ mingw-get install msys-rebase

를 실행한다. 위 명령을 성공적으로 실행되면, MinGW Shell 을 닫고,

탐색기에서 msys 의 bin 디렉토리로 이동하여 dash 를 실행한다.

그리고 아래와 같이 입력한다.

/bin/rebaseall

만약 에러 메시지가 출력된다면, (예를 들면 read-only 속성이 걸려 있다던가...)

에러 메시지를 보고 적절한 조치를 취해 준 뒤 다시 실행한다.


마지막으로

/bin/peflagsall

을 해주면,

(위에서 이야기 했던) dll 파일에 dynamicbase flag 를 set 한다고 되어 있다.

dash 에서는 현재 환경을 MinGW32 로 인식하고 있어서 별 다른 작업을 하지는 않는데,

실제 문제가 되는 건 msys 기 때문에 스크립트 파일의 Platform 환경변수를

강제로 바꾸어 주어야 되는지는 잘 모르겠다.

써 보다가 문제가 생긴다면 고려해 봐야할 듯.


P.S

아무래도 생각해도 이 에러가 발생한 건,

회사의 보안 프로그램이 해당 영역을 이미 차지하고 있기 때문이라는 생각이 든다.


반응형

설정

트랙백

댓글