-g 옵션으로 gcc를 실행하면 objdump로 실행 파일을 실행할 때 일부 C 코드를 볼 수 있습니다.GCC 디버깅 옵션이 objdump로 볼 때 #if를 존중하지 않습니다.
#if 블록에 코드 섹션이있는 프로그램이 있습니다. 내가 gcc를 -g와 함께 실행하고 objdump를 실행하면 #ifs에 포함되지 않아야하는 c 코드가 표시됩니다. 다음 C 코드 예
:
#define ENABLED 0
#if ENABLED
startSomething();
#endif
gcc -g
컴파일
섹션 :
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 블록을 잘못 포함하는 것처럼 보입니다.
샘플에 표시된 것처럼 gcc는'startSomething()'을 컴파일하지 않습니다. (물론 아닙니다.) 그러나 objdump에서 볼 수있는 것은이 함수의 프로토 타입 또는 구현입니다 (호출과 반대 됨). 이를 증명하기 위해서는 전체 샘플이 필요합니다. – Scheff
@Scheff 답장을 보내 주셔서 감사합니다. 구현은 또한 obj 덤프에서 볼 수있는 호출 인 경우 해시로 래핑됩니다. –
objdump에 대해 아무것도 몰라요. 그러나 매크로 호출 후에 어떻게 컴파일러가 코드를 컴파일하는지보고 싶다면'-E'로 "컴파일"하십시오. 매크로 호출 후 C 소스 코드를 보여줘야한다. – Scheff