C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[12402] 컴파일러가 생성하는 실행파일이 항상 같지 않다면 그 이유는 뭘까요
초보 [] 2338 읽음    2006-11-16 00:14
이 게시판 아래에 무료컴파일러(볼랜드 꺼 아님)를 쓰면서 겪은 황당한 일을 소개한 사람입니다.

이번엔 그 글에서도 언급한 기본적인 질문만 올려봅니다. 부디 고수님들의 답변 바랍니다.
- 귀하의 Compiler(어느 회사꺼든간에)로 똑같은 소스에 대해 두번이상 Build를 반복해 실행파일들을 만들어
   서로 비교해 보시고(파일들을 Byte단위로 완전비교해 같은 파일인지 아닌지를 알려주는 도구들은 많죠)
   결과를 얘기해주십쇼.
- 그리고 다르다면 왜 다른건지 아시는대로 말씀해주세요. 저같은 초보로서는, compiler제작자가 장난코드를
  compiler에 넣지 않는한 완전히 같아야 되는거 같은데요.

이문제는 자기혼자 취미나 공부삼아 프로그램 만드는 사람들은 별 관심없겠지만, 무료/유료로 배포하려는
사람들 입장에선 진짜 신경쓰이는 문제 아니겠읍니까. 소스가 정해졌을때 일정한 Binary가 나오지 않는다면
사용자에게 가서 언제 무슨 현상을 일으킬지 걱정되는 노릇이고, 게다가 개발자PC의 자료들이 거기 담겨 유출되는
것도(게시판 아래쪽 글 참조) 황당하고요.

바이러스도 생각해봤지만 compiler를 새로 깔아봐도 마찬가지더라구요. 그리고 첫번째 글에 대한 답변주신 두분께
감사드립니다. 하지만, 한분 의견대로 실제 디스크 위치를 바꿔봐도 마찬가지였고요, 다른분 의견은 현상에 대한
대응책중 하나로서 저도 공감하는바이지만, 저의 의문은 도데체 왜 이런 일이 일어나는지 내지는 모든 compiler가
다 이런건지 실제 이런 경험을 하셨는지등을 듣고 싶습니다.
김호광 [testcode]   2006-11-16 04:11 X
음... 컴파일러가 뭔지 알려주셨으면 하네요 ARM 용 C 컴파일러 중 일부는 바이너리를 만들 때 사이즈가 약간씩 달라지는 경우가 있습니다. 디버그 빌드에서 나타나지요. 공개된 컴파일러들 중에서 완성이 안된 것이 있고 사실상 릴리즈로 컴파일되지 않는 경우가 있습니다. -;; gcc 나 BCB, VC 같은 경우에서 발생하지 않는 상태이기 때문에 뭐라 이야기 드리기 그렇군요...
임베디드 컴파일러 중에서 사이즈가 빌드할 때마다 몇 바이트씩 달라지는 경우가 있긴 했지만 위의 내용으로 볼 때는 win32용일 듯 싶어 제외해야할 것 같네요

제가 추론하는 가능성은

1. 그  컴파일러가 완전히 최적화 빌드를 하지 못하여 최적화 결과가 빌드 때마다 다르다 -;;
2. 어셈 루틴을 썼다. 컴파일러에서 일지하는 최적화가 다를 수 있다.
아제나 [azena]   2006-11-16 09:07 X
이런... 또 질문을 올리셨군요. 여긴 자게인데...
어쟀든 해답을 얻고 싶다면 EXE 파일의 구조에 대하여 공부해보시기 바랍니다.
그러면 EXE 파일이 코드 영역과 데이터 영역으로 나뉘어 있다는 사실을 알게 될 것이고 데이터 영역에 들어 있는 데이터들이 전부 초기화가 안된다는 사실을 알게 될거예요.
추천하는 서적으로는 'Windows 시스템 실행파일의 구조와 원리-이호동님저'가 있습니다.
간단하게 테스트할 수 있는 방법으로는, void main() {} 이라는 간단한 프로그램을 컴파일 한 후에 용량을 체크하고 전역변수로 char buffer[10240]; 이라는 변수를 선언 후 컴파일하면 실행 파일의 크기가 정확히 10kb 증가한 것을 볼 수 있는데, 이것은 바로 위에 언급한 EXE 파일의 구조적 이유 때문이며 이 공간은 컴파일러에 의하여 초기화가 안되므로 무슨값이 들어갈지는 며느리도 알 수 없으므로 문제가 생기는 것 입니다.
마지막으로 질문은 질문란에 ㅡㅡ
김호광 [testcode]   2006-11-16 20:54 X
같은 소스를 rebuild all 했다는 말 같은데요-;;
아제나 [azena]   2006-11-17 10:52 X
이런~~ 제가 너무 말을 어렵게 했나요?
char buffer[10240]; 이라는 공간은 초기화가 안된 메모리에 있는 아무값이나 들어가기 때문에 EXE 파일에 내용도 당연히 빌드할때마다 틀려지죠.
김호광 [testcode]   2006-11-17 22:23 X
음.. 제가 볼 때는 동일한 코드를 리빌드 all 했다는 것이 아닌지요

- 귀하의 Compiler(어느 회사꺼든간에)로 똑같은 소스에 대해 두번이상 Build를 반복해 실행파일들을 만들어
   서로 비교해 보시고(파일들을 Byte단위로 완전비교해 같은 파일인지 아닌지를 알려주는 도구들은 많죠)
   결과를 얘기해주십쇼.

라고 하는데요...

당연히 변수 하나라도 선언하면 사이즈가 커지는 것은 당연지사인데요 어느 OS나 당연한 이야기지요 .-;; 그런데 같은 코드를 빌드할 때마다 사이즈가 틀려진다라는 결과가 있다고 위의 첫 글을 쓰신 분이 이야기 하셨는데, 변수를 별도로 덧붙였다는 이야기는 아닌 듯 하네요
아제나 [azena]   2006-11-20 11:08 X
김호광님이 잘못 이해를 하셨네요.
크기가 달라진다는게 아니라 파일 내용이 바뀐다는 이야기였습니다.
12369번에도 같은 내용의 글이 있습니다.

+ -

관련 글 리스트
12402 컴파일러가 생성하는 실행파일이 항상 같지 않다면 그 이유는 뭘까요 초보 2338 2006/11/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.