2014-04-16 11 views
0

GCC 버전 4.2.4를 사용 중입니다. 아래에 설명 된 문제는 Gcc 4.6.x에서 재현 할 수 없으며 테스트 한 두 가지 버전입니다.열거로 인해 GCC에서 최적화 된 바이너리 변경 4.2.4

enum test 
{ 
    VALUE_1 = 1, 
    VALUE_2 = 2, 

    VALUE_MAX = 0xFFFF, 
}; 

이 헤더는 몇 소스 파일에 포함되어 있으며 각 소스 파일은 컴파일시에 오브젝트 (.o 인)을 생성 abc.h :

나는 열거, 헤더를 정의하는 헤더 파일이 있습니다. 그리고 abc.h의 열거 형을 참조하지 않는 소스 파일은 거의 없습니다.

내가보기에 문제는 abc.h에 새로운 상수 (VALUE_3)를 추가하면 열거 형을 사용하지 않는 객체의 이진 md5sum도 변경됩니다. 이것은 최적화를 적용 할 때만 발생하며 컴파일시에는 그렇지 않습니다.

나는 그것이 최적화와 함께 활성화되는 플래그 -ftree-vrp와 -ftree-dominator-opts와 관련이 있다고 생각합니다. 이 플래그를 -fno와 함께 사용하면 오브젝트의 일부가 변경되지만 다른 일부는 변경되지 않습니다 (이 플래그로 변경 사항이 적용됨).

또 다른 흥미로운 사실은 md5sum이 짝수 또는 홀수의 열거에 대해 동일하게 나오는 것입니다.

백엔드에서 어떤 일이 벌어지고 있는지 이해할 수 있도록 도와 주시겠습니까? 해당 특정 개체에 대한 실제 코드가 변경되지 않은 경우 md5sum을 유지 관리하는 바이너리 변경을 방지 할 수있는 방법이 있습니까?

미리 감사드립니다.

편집 됨 :

다음 개체는 diff입니다. 다른 객체의 경우에는 다른 몇 가지 변경 사항이 있습니다 (예 : mov 기타 지침). 볼 수 있듯이 일부 명령어의 피연산자 레지스터 만 바뀝니다. 그 이유와 그 최적화를 피하는 방법을 이해하고 싶습니다.

# diff test.o.1 test.o.2 
1548,1549c1548,1549 
<  cmpl %eax, %ecx 
<  jg  .L442 
--- 
>  cmpl %ecx, %eax 
>  jl  .L442 
+2

단순히 MD5 해시 변경 내용이 불충분하다고 말하면됩니다. 이 수준까지 신경 쓰면,'objdump -d'와 친구들을 사용해 .o 파일에서 실제로 * 변경된 것을 결정해야합니다. –

+0

고마워요 조나단. 질문 설명이 수정되었습니다. – Akamai

+0

질문 설명이 수정되었습니다. – Akamai

답변

1

조나단 라인 하트의 의혹 "은 분기 예측와 함께 할 수있다 "를 확인하려면 이진 변화를

을 피할 수있는 방법이있다, 당신은 옵션 -fno-guess-branch-probability을 시도 할 수 있습니다.