2014-01-20 2 views
3

동일한 .c 및 .h 파일을 두 번 컴파일하고 동일한 크기이지만 다른 md5sum을 갖는 오브젝트 파일을 가져옵니다.두 개의 오브젝트 파일에서 md5sum의 차이점

1) cpcidskephemerissegment.o: file format elf64-x86-64

Disassembly of section .text: 

0000000000000000 <_ZN68_GLOBAL__N_sdk_segment_cpcidskephemerissegment.cpp_00000000_B8B9E66611MinFunctionEii>: 

2) cpcidskephemerissegment.o: file format elf64-x86-64

Disassembly of section .text: 

0000000000000000 <_ZN68_GLOBAL__N_sdk_segment_cpcidskephemerissegment.cpp_00000000_8B65537811MinFunctionEii>: 

원인이 될 수있는 일 : objdump -d 여기에서의 유일한 차이는? 감사!

답변

2

이유는 많은 수 있습니다 : __DATE__ 같은

  • 사용하여 매크로와 각 빌드에 대한 증가하는 __TIME__
  • 포함하기 카운터
  • 타임 스탬프 (또는 유사 변수 수량) (리눅스 커널이 작업을 수행합니다) .comments ELF 섹션에 포함되어 있습니다. 이를 수행하는 컴파일러의 한 예가 AIX의 xlC 컴파일러입니다.
  • 이름 변경의 결과로 다른 이름 (예 : C++)
  • 빌드 프로세스에 영향을주는 환경 변수가 변경되었습니다.
  • 컴파일러 버그 (들) (같지도)

비트 동일한 생산은 GCC의 -frandom-seed 매개 변수를 사용하여 작성합니다. GCC 4.3 이전에 문제를 일으킬 수있는 상황이 있었지만 이제 GCC는 익명의 네임 스페이스에 정의 된 함수를 정적 기호로 변환합니다. 그러나 -frandom-seed에 대해 다른 값을 사용하여 각 파일을 컴파일하는 경우 안전 할 수 있습니다. 가장 간단한 방법은 파일 이름을 시드로 사용하는 것입니다.

+0

문제를 발견하는 데 도움이 될 수있는 방법은 무엇입니까? – Sas

+1

차이점이 맹 글링 된 심볼 이름에 있다는 것을 알게되었으므로, 나는 맹 글링 프로세스가 조작 될 수 있는지 확신 할 수 없다. 'extern "C"{}'블록에서 함수 선언을 강제하면 동일한 객체 파일을 생성 할 수 있지만 실제로는 올바른 해결책은 아닙니다. 절대적으로 동일한 객체 파일이 필요합니까? –

+0

정말 예, .so와 .rpm 파일의 크기가 다르기 때문에 우리 제품이 인증을받을 수 없기 때문에 : ( – Sas

1

마지막으로 답변을 찾았습니다.

namespace 
{ 
MinFunction(int a, int b) { ... } 
} 

내가 네임 스페이스의 이름과 오브젝트 파일의 안정적인 체크섬을 가지고 : 소스에서

{unnamed namespace}: MinFunction(int, int)

했다 :

c++filt 명령은 함수의 원래 이름을 준! 필자는 컴파일러가이 네임 스페이스의 이름을 지정하는 방법을 모르고 소스 파일에 임의의 숫자를 더한 경로를 사용했습니다.

+1

"답변을 찾았습니다"- - 아니, 당신은 *. * 아닙니다. 해결 방법을 찾았습니다. 곧 답변을 드리겠습니다. –

2

컴파일러는이 네임 스페이스의 이름을 지정하는 방법을 모르고 소스 파일에 경로와 임의의 숫자를 더한 경로를 사용했습니다.

컴파일러는 이름없는 네임 스페이스의 기호가 프로그램의 다른 기호와 충돌하지 않도록해야합니다. 기본적으로은 소스의 전체 파일 이름을 가져 와서 무작위 해시 값을 추가하여 얻을 수 있습니다. 동일한 소스를 두 번 (예 : 다른 매크로를 사용하여) 컴파일하고 두 개의 객체를 단일 프로그램으로 링크하는 것은 합법적입니다. 이름이없는 네임 스페이스 기호 이어야하며 시드가없는 소스 파일 이름만으로는 충분하지 않습니다.

동일한 소스 파일을 두 번 이상 연결하지 않고 다시 컴파일 할 때 비트가 동일한 개체 파일을 사용하려는 경우 해결 방법은 컴파일 라인에 -frandom-seed="abcd"을 추가하는 것입니다 ("abcd" 원하는 파일이 있으면 파일 이름을 임의 시드 값으로 사용하는 것이 일반적입니다. 문서 here.

+0

설명해 주셔서 감사합니다! – Sas

관련 문제