글
[MSYS] *** Couldn't reserve space for cygwin's heap (0xXXXXXXXX <0xXXXXXXX>) in child, Win32 error 0
원래 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
아무래도 생각해도 이 에러가 발생한 건,
회사의 보안 프로그램이 해당 영역을 이미 차지하고 있기 때문이라는 생각이 든다.
'프로그래밍' 카테고리의 다른 글
Hues, Tints, Tones, Shades (0) | 2015.10.22 |
---|---|
[STL] vector 의 정렬 - object pointer 정렬 (1) | 2013.04.25 |
[Code::Blocks] Using redirection as arguments on windows version. (윈도 버전에서 표준입출력 리다이렉션 하기) (1) | 2013.02.23 |
fgets(buf, buf_size, stdin), gets(buf) 차이? (0) | 2013.02.20 |
Dynamic Programming - Edit Distance, Two-Person Traversal... (0) | 2012.08.09 |