을 찾는 위치에서 컴퓨터 코드(gcc/objdump-d)
-
08-07-2019 - |
문제
이 있는 경우 특정인의 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.o
나
gcc bla.c -g -fsave-temps -fverbose-asm
출력의 주요 기능
와 바,바는 인라인되지 않습니다.또한 때에는 전화 또는 이동
바하는 그는 인라인되지 않습니다.
귀하의 경우에 당신이 볼 수있는 경우에는 바는 지역 변수는 요구실에
현지 스택입니다.면 막대는 인라인 스택 조정(예: sub $0x8,%esp
)
이 완료 후 오른쪽 메인 프롤로그,주요 액세스할 수 있는 var.하지 않을 경우 그것은 개인이됩니다.