문제

이 있는 경우 특정인의 C 코드에서는 마음을 검사하는 기계에 산출,어떻게 당신이 그것을 찾을에서 objdump 출력됩니다.여기에는 예입니다

if (cond)
   foo;
   bar();

고 확인하고 싶으면 바로 인라인되 나는 것 같습니다.또는 당신은 사용이 일부 다른 도구를 대신 objdump?

도움이 되었습니까?

해결책

시작할 수 있습니다 objdump 사용 -S 옵션(아 "objdump -Sd a.out").이 표시됩니다 소스 intermixxed 와 어셈블러 코드,경우에는 원본 파일 코드를 컴파일에 사용할 수 있습니다.

또는,사용할 수 있습니다 다음 방법:

int main(void) {
    int a = 0;
    asm("#");
    return a;
}

       .file   "a.c"
        .text
.globl main
        .type   main, @function
main:
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ecx
        subl    $16, %esp
        movl    $0, -8(%ebp)
#APP
# 3 "a.c" 1
        #
# 0 "" 2
#NO_APP
        movl    -8(%ebp), %eax
        addl    $16, %esp
        popl    %ecx
        popl    %ebp
        leal    -4(%ecx), %esp
        ret
        .size   main, .-main
        .ident  "GCC: (GNU) 4.3.2"
        .section        .note.GNU-stack,"",@progbits

다른 팁

당신은 디버거해야 또한 당신이 볼 소스 코드와 매칭 어셈블리는 경우 컴파일에 디버그 상징입니다.이 gcc option-g gdb disass 명령입니다.

만약 당신이 컴파일하는 gcc 사용할 수 있습니다-S 를 생성하는 어셈블리 파일을 직접 있습니다.이 파일은 일반적으로 몇 가지 유용한 정보를 포함하여 그 이름을 작동하고 때로는 라인은 숫자를 위해 코드(에 따라 컴파일 옵션을 사용하여).

함수 호출에서 감지 어셈블리에 의해 일반적인 기능습니다.

와 i386 그

  55      push %ebp
  89 e5   mov %esp, %ebp
  ...
  c9      leave # optional
  c3      ret

amd64/x86_64 는 유사한다(다만 쿼드 접두사 48):

  55                    push   %rbp
  48 89 e5              mov    %rsp,%rbp
  ..
  c9                    leaveq # optional
  c3                    retq   

그래서 때를 감지하는 내부 h objdump -S bla.ogcc bla.c -g -fsave-temps -fverbose-asm 출력의 주요 기능 와 바,바는 인라인되지 않습니다.또한 때에는 전화 또는 이동 바하는 그는 인라인되지 않습니다.

귀하의 경우에 당신이 볼 수있는 경우에는 바는 지역 변수는 요구실에 현지 스택입니다.면 막대는 인라인 스택 조정(예: sub $0x8,%esp) 이 완료 후 오른쪽 메인 프롤로그,주요 액세스할 수 있는 var.하지 않을 경우 그것은 개인이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top