MinGW vs gcc(in linux)

아르아의 이미지

리눅스에서 돌려야 하는 C 프로그램을 짜야해서
eclipse-cdt를 사용해 프로그래밍을 하던중
(PyDev도 좋고 해서 쓰다보니 eclipse-cdt도 쓰게 되더군요)
리눅스의 eclipse가 느리다는 생각에
윈도우즈에서 eclipse-cdt를 사용해 개발을 했습니다.
윈도우즈에서는 MinGW를 깔았고요.

그런데 MinGW에서는 잘 돌아가던 프로그램이
리눅스에서 돌리면
segment fault
를 외치며 돌아가시는겁니다.

'같은 버전의 gcc인데 말도 안되!'
있을 수 없는 일이라며 전 울다가...
assert신공으로 디버깅을 시작했습니다.

MinGW에서는 malloc()한것을
free();를 해도 데이터가 얼마간 살아있는 반면에
리눅스는 free();를 해주면 바로 사라지는군요.
그래서 제가 부적절한 위치에서 free()를 했음에도
MinGW는 제대로 돌았던 것이고, 리눅스에서는 뻗은것이었습니다.

리눅스에서 개발 안하다가 이런일도 겪게 되네요.
그래도 우분투도, 페도라도
eclipse가 윈도우즈에서보다 느린것 같아서 말이죠...

jong10의 이미지

조엘 온 소프트웨어 42장에 나오는 에피소드가 떠오르네요.

---------------------------
저는 이런 이야기를 심시티 개발자에게서 처음 들었습니다. 당시 게임 프로그램에 결정적인 버그가 있었다고 하더군요. 해제한 메모리를 참조하는 심각한 버그인데, DOS에서는 운좋게도 문제가 없었으나 윈도우에서는 말썽이었답니다. 윈도우에서는 해제한 메모리를 다른 응용프로그램이 바로 채어갈 가능성이 높기 때문이죠. 윈도우 개발팀 테스터는 많은 응용프로그램을 구해다 테스트를 했는데, 심시티는 계속 죽었답니다. 테스터는 윈도우 개발팀에게 이 문제를 보고했고, 윈도우 개발팀은 심시티를 역어셈블한 다음에 디버거로 추척해 버그를 찾아냈답니다. 그리고는 심시티를 돌릴 경우 메모리 할당자를 특수 모드로 돌려서 해제 후에도 메모리를 참조할 수 있게 만들었답니다.

이 정도는 보통이었습니다. 윈도우 테스트팀은 그 규모가 대단했을 뿐만 아니라, 어떤 사용자도 운영체제 판올림에 문제가 있어서는 안된다는 점을 지상최대 목표로 삼았습니다. 괴상한 짓을 하는 응용프로그램, 문서화되지 않은 함수를 호출하는 응용프로그램, 윈도우 버전 N에 있었던 버그를 이용하여 구현되었으나 윈도우 버전 N+1에서 버그가 없어지면서 문제를 일으킬 소지가 있는 응용프로그램 등, 사용자가 어떤 응용프로그램을 설치했건 판올림 후에도 문제없이 돌아야 했습니다. 레지스트리에서 AppCompatibility 부분을 뒤져보면, 윈도우가 특별취급하는 응용프로그램 전부를 확인할 수 있습니다. 옛 버전에 있었던 버그나 기이한 현상을 잘 흉내내서 응용프로그램이 계속 돌아가게 합니다. 다음은 레이몬드 첸이 한 말입니다. "마이크로소프트 사가 OS 판올림을 이용해 응용프로그램을 고의로 못쓰게 만든다는 비난을 받을 때면 저는 굉장히 화가 납니다. 윈도우 95에서 응용프로그램이 실패하면, 저는 이를 개인적인 실패로 여겼습니다. 윈도우 95에서 돌릴 수 있도록 남의 프로그램 버그까지 디버깅하느라 밤을 샌 적이 하루이틀이 아니었습니다."

모든 것은 모든것에 잇닿아있다. - 호르헤 루이스 보르헤스