2011-03-07 4 views
0

make 유틸리티를 사용하여 코드를 컴파일하고 바이너리를 받았습니다.make를 사용하여 다른 시간대에 컴파일 할 때 바이너리에 약간의 차이가 발생할 수 있습니까?

나는 메이크 파일 (일부 지점에서 삽입 됨)에서 몇 가지 변경 사항을 사용하여 코드를 다시 컴파일하고 바이너리에 약간의 차이가 있습니다. 그 차이는 "비교를 넘어서"보고되었습니다. 추가로 체크인하기 위해 makefile에서 변경하지 않고 코드를 다시 컴파일하고 바이너리가 여전히 다른 것을 발견했습니다.

서로 다른 시간에 컴파일 된 동일한 코드가 (크기 및 내용면에서) 약간 다른 바이너리가 생성되는 이유는 무엇입니까? 변경 사항이 합법적이고 바이너리가 논리적으로 동일한 지 확인하려면 어떻게해야합니까?

추가 설명이 필요합니까?

+1

빌드 시스템이 소스 코드를 생성합니까? 생성 된 코드에 UUID와 같은 시간 스탬프 또는 일종의 임의의 문자열/숫자를 넣을 수 있습니까? –

답변

1

당신이 무엇을 만들고 있는지 (C, C++ 등) 말하지 않았지만 그것이 타임 스탬프라면 놀랄 일이 아닙니다.

빌드하는 이진 형식의 형식 (운영 체제에 따라 다름)을 찾을 수 있으며 변경되는 위치에 시간 소인이 있는지 여부를 확인할 수 있습니다.

매우 작은 바이너리를 생성하는 작은 샘플 프로그램에서 이것을 수행하는 것이 가장 쉽습니다. 모든 것이 의미하는 바를 쉽게 해결할 수 있습니다.

0

ELF 오브젝트 파일에는 컴파일 시점에 대한 타임 스탬프가 있습니다. 따라서 컴파일 할 때마다 (Linux 또는 Solaris에서) 다른 오브젝트 파일을 기대할 수 있습니다. 다른 시스템 파일에서도 마찬가지 일 수 있습니다.

+0

안녕! 답장을 보내 주셔서 감사합니다. 당신이 내가 변경 한 것이 작동하는지 아닌지 확인하는 방법을 안내해 줄 수 있습니까? 나는 컴파일 된 코드를 변경하고 아무런 오류도 없었다. 그러나 멘토는 바이너리에 차이가 있는지 확인해달라고 부탁했습니다. 나는 makefile의 일부 장소에서 -j를 사용 했으므로 실행이 더 빨라졌습니다! – ankit

+0

@ankit :'make' 프로세스의'-j'는 빌드 속도를 향상 시키지만 오브젝트 파일의 타임 스탬프는 오브젝트 파일의 타임 스탬프가 없으면 더 가깝다는 것을 제외하고는 오브젝트 코드에 영향을 미치지 않습니다. ('-j' 옵션은 내가 아는 C 컴파일러에서는 표준적인 의미가 없습니다.) '내가 만든 변경이 효과가 있는지 없는지'라고 말할 때, 당신은 무엇을 기대하고 있습니까? 예상대로 출력이 다릅니 까? 그렇다면 예, 그들은 일하고 있습니다. 출력이 이전보다 더 빠르게 나타 납니까? 그런 다음 변경 사항이 적용됩니다. 파일 크기와 체크섬이 다른가요? 그런 다음 바이너리가 변경되었습니다. –

+0

@ankit : 또한 어느 플랫폼에서 작업하고 있습니까? 이 질문에서 언급하는 것이 도움이되는 경우가 많습니다. –