2017-02-21 19 views
0

-g 옵션으로 gcc를 실행하면 objdump로 실행 파일을 실행할 때 일부 C 코드를 볼 수 있습니다.GCC 디버깅 옵션이 objdump로 볼 때 #if를 존중하지 않습니다.

#if 블록에 코드 섹션이있는 프로그램이 있습니다. 내가 gcc를 -g와 함께 실행하고 objdump를 실행하면 #ifs에 포함되지 않아야하는 c 코드가 표시됩니다. 다음 C 코드 예

:

#define ENABLED 0 

#if ENABLED 
    startSomething(); 
#endif 

gcc -g 컴파일

는 startSomething 함수 호출은 objdump를 출력에 포함된다. objdump를 출력

섹션 :

261c:  1c19   adds r1, r3, #0 
    261e:  f7fe f9a1  bl  964 <init> 
    } 

    startSomething(); 
#else 

이 예상되는 동작인가? startSomething에 대한 호출과 startSomething의 실제 함수 정의가 #if ENABLED에 래핑 된 경우 포함되지 않아야하고 gcc가이를 제거해야한다고 생각했을 것입니다.

gcc/objdump가 전처리 장치 #ifs에 더 많은주의를 기울여서 결코 실행되지 않는 objdump에서 코드를 얻지 못하도록하는 방법이 있습니까?

도움 주셔서 감사합니다.

편집 : 또한 실제로 코드를 실행할 때이 함수가 실행되지 않는다는 것을 알고 있습니다. 그래서 나는 다른 곳에서 ENABLED를 설정하지 않았다는 것을 안다.

EDIT 2 : objdump가 실제로 함수 호출과 관련된 asm 명령어를 출력하지 않는 것이 좋습니다. 그래서 그것은 함수 호출과 관련하여 함수 호출 c 블록을 잘못 포함하는 것처럼 보입니다.

+2

샘플에 표시된 것처럼 gcc는'startSomething()'을 컴파일하지 않습니다. (물론 아닙니다.) 그러나 objdump에서 볼 수있는 것은이 함수의 프로토 타입 또는 구현입니다 (호출과 반대 됨). 이를 증명하기 위해서는 전체 샘플이 필요합니다. – Scheff

+0

@Scheff 답장을 보내 주셔서 감사합니다. 구현은 또한 obj 덤프에서 볼 수있는 호출 인 경우 해시로 래핑됩니다. –

+0

objdump에 대해 아무것도 몰라요. 그러나 매크로 호출 후에 어떻게 컴파일러가 코드를 컴파일하는지보고 싶다면'-E'로 "컴파일"하십시오. 매크로 호출 후 C 소스 코드를 보여줘야한다. – Scheff

답변

4

Objdump는 C 또는 gcc 또는 전처리기에 대해 조금이라도 생각하지 않습니다. 그것은 "라인 L에서의 진술로부터 오는 주소 범위 S-E에서의 명령"형태의 정보를 갖는다. 라인 L1과 L2에 해당하는 두 개의 인접한 명령어 블록이 주어지면 L1과 L2 사이의 모든 라인이 표시 될 수 있습니다.

이것은 디버거가 작동하는 것과 같습니다. 목록에서 gdb가 주석을 건너 뛰거나 코드의 일부 또는 ifdef'd 또는 빈 줄을 기대하지 않습니다.

+0

흠, 어쩌면 내가 objdump를 사용하고있는 것입니다. 나에게 이것은 실행 파일에 포함되지 않은 코드를보기에는 혼란 스러웠다. 비록 설명을 주셔서 감사합니다 :) –