이것이 가능하지 않다고 생각했기 때문에 이것을 클릭했다면, 나는 그것에 부딪 칠 때까지 똑같은 생각을했습니다.소스와 컴파일러 플래그가 수정되지 않은 경우에도 오브젝트 파일의 컴파일이 달라질 수 있습니까?
저는 PIC 용 C로 작성된 프로젝트에서 작업 중이며, Makefile로 빌드되었습니다. Makefile은 매우 혼란스러워서 정리하고 싶었습니다. (이 프로젝트에 하위 디렉토리 SDCC와 GPUTILS와 내장..)
make clean
make
md5sum ./* > ../allsums.txt
다음 : 나는 그것을 한 동안 아무것도 휴식하지 않았다 확인하기 위해, 나는 신선한 메이크업 다음 모든 파일의 해시를 기록 나는 Makefile을 수정하고 이번에는 결과 파일을 allsums.txt과 비교했다. 흥미롭게도 .o 파일의 해시는 일치하지 않지만 최종 결과는 일치했습니다. 그 문제가 내가 어떻게 든 창조 한 문제라고 가정하면, 나는 그것을 사냥하려고 많은 시간을 보냈다.
그런 직감에, 나는 원래 Makefile을 사용하여 이런 짓을 :
make clean
make
md5sum ./* > ../allsums.txt
make clean
make
md5sum -c ../allsums.txt
나는 오브젝트 파일도 여기에 변경된 것을 발견! 어떤 검색은 this question으로 이어 졌는데, 이는 (적어도 gcc의 경우) .o 파일이 각 컴파일 사이에서 변경되었음을 확인했습니다.
이 원인은 무엇입니까?
아니요, gcc는 빌드가 변경되지 않는 한 동일한 파일 (즉, 일치)을 생성합니다. 소스 파일에 컴파일 인자'-DDATE = "\'date \'"'가있는 곳 ('char build_time [] = DATE')과 같은 것이 있으면 그것들이 바뀔 수 있습니다. –
이것을 이해/해결하는 더 좋은 방법은 각 파일의 16 진 덤프 ('od' 또는'xxd')와'diff'를 사용하여 어떤 부분이 변경되는지 확인하는 것입니다. 그런 다음 주어진'.o' 섹션에서 어떤 오프셋이 변경되었는지를보기 위해 거꾸로 작업 할 수 있습니다. 그런 다음 특정 기호와 연결하십시오. 그런 다음'.h' 또는'.c' 파일에서 심볼의 정의를 찾으십시오. 또한, 길이가 동일합니까? –
개체 및 실행 파일에 빌드 별 정보가 포함되는 경우는 흔합니다. 예를 들어, PE 헤더에는 링커에서 채워지는 타임 스탬프 필드가 들어 있습니다 (PE는 Windows에서 실행 파일 및 DLL 형식 임). –