2010-11-24 4 views
0

임시로 도입 된 컴파일러의 존재에 대해 아래 코드 (file1.o)에서 생성 된 오브젝트 파일을 검사하는 방법이 있습니까? 오브젝트 파일에서 그러한 정보를 얻기 위해 우리는 어떤 툴을 사용할 수 있습니까?C++ 컴파일러가 도입 한 임시 파일의 존재 여부에 대해 오브젝트 파일을 검사 할 수 있습니까?

//file1.cpp 
void func(const int& num){} 
int main(){ func(2); } 
+1

특별한 이유가 있습니까? –

+0

나는 이것에 @Etienne과 함께있다. "우리는 어떻게해야합니까 "라고 질문하는 것보다 "을 어떻게 얻을 수 있습니까?"라고 물어보십시오. 여기서 X는 를 수행하여 현재 목표로하고 (실수로) 달성하고자하는 목표를 나타냅니다. – sbi

+0

'1 + Foo() + 2 + Bar() + 3'의'int' 임시와 같은 일시는 피로하기가 어렵습니다. 컴파일러는 누적에 대해 하나의 레지스터 만 사용하지만 C++은 공식적으로 평가 중에 세 가지 임시 변수를가집니다. – MSalters

답변

3

내가 생각할 수있는 가장 쉬운 방법은 객체 파일을 사용하는 프로그램을로드하고 디버거에서 함수를 분해하는 것입니다. 당신이 게시 한 프로그램 코드는 이것에 대해 잘 작동합니다. func에 대한 호출을 중단 한 다음 함수에 단일 단계로 들어갈 때 어셈블러를 표시하십시오.

보다 복잡한 프로그램에서 일반적으로 주어진 함수에 대한 어셈블러 코드를 이름으로 표시 할 수 있습니다. 디버거 설명서에서이 작업을 수행하는 방법을 확인하십시오. Windows (Visual Studio)에서 Disassembly 창을 열고 함수의 이름을 입력하여 어셈블러 코드를 표시 할 수 있습니다.

소스가있는 경우 대부분의 컴파일러에서 어셈블러를 출력 할 수 있으며 소스 코드와 혼합 될 수 있습니다. Visual C++의 경우 이것은 /Fa입니다.

+1

주 : gdb를 사용하는 경우 오브젝트 파일을 직접 열어 해당 기능을 분해 할 수 있습니다. 'gdb file1.o','(gdb) disas main','(gdb) disas func'. 그러나 다른 기호에 대한 언급은 이상하게 보일 것입니다. – aschepler

0

ELF 시스템에 GNU binutils가있는 경우 -s 스위치를 사용하여 readelf으로 전화 할 수 있습니다.

0

소스를 사용할 수 있으면 컴파일러에서 생성 한 어셈블러 파일 (gcc의 경우 -save-temps)을 보는 것이 더 쉽습니다. 그렇지 않으면 objdump은 친구입니다.

0

clang -cc1 --ast-print-xml을 사용하면 번역 단위의 XML 표현을 얻을 수 있습니다. 임시 환자의 존재는 AST에서 쉽게 발견 할 수 있습니다.