如何解决这些说明在拆装阶段有什么指示?
你好,当我在clion IDE调试器中运行c ++代码时,main()
返回之后,调试器进入一个名为反汇编的文件,它包含看起来像汇编代码的文件。这些指示是什么?它有什么作用?我应该在乎吗?因为我是c ++的新手,所以我已经熟悉了该语言,IDE和其他任何相关内容。
start:
nop
movl %eax,%edi
callq 0x2e82e ; symbol stub for: exit
hlt
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
exit:
jmpq *0x268c241c(%rip)
exit:
pushq %rbp
movq %rsp,%rbp
pushq %rbx
pushq %rax
movl %edi,%ebx
cmpl $0xad,%edi
jne 0x5a404 ; <+41>
leaq 0x2683a31e(%rip),%rcx
movq (%rcx),%rax
testq %rax,%rax
je 0x5a404 ; <+41>
xorl %eax,%eax
xchgq %rax,(%rcx)
testq %rax,%rax
jne 0x5a427 ; <+76>
xorl %eax,%eax
callq 0x8017c ; symbol stub for: _tlv_exit
xorl %edi,%edi
callq 0x5a196 ; __cxa_finalize
movq 0x268354f7(%rip),%rax
je 0x5a420 ; <+69>
callq *%rax
movl %ebx,%edi
callq 0x8000e ; symbol stub for: __exit
callq *%rax
ud2
还有这个
_tlv_exit:
pushq %rbp
movq %rsp,%rbp
pushq %rbx
pushq %rax
movq 0x268db5e9(%rip),%rdi
callq 0x2e92a ; symbol stub for: pthread_getspecific
testq %rax,%rax
je 0x18e20 ; <+54>
movq %rax,%rbx
movq 0x268db5d5(%rip),%rdi
xorl %esi,%esi
callq 0x2e942 ; symbol stub for: pthread_setspecific
movq %rbx,%rdi
addq $0x8,%rsp
popq %rbx
popq %rbp
jmp 0x1983e ; tlv_finalize_list
addq $0x8,%rsp
popq %rbx
popq %rbp
retq
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
start:
nop
movl %eax,%edi
callq 0x2e82e ; symbol stub for: exit
hlt
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
exit:
jmpq *0x268c241c(%rip)
pthread_getspecific:
jmpq *0x268c2470(%rip)
__cxa_finalize_ranges:
pushq %rbp
movq %rsp,%rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18,%rsp
movl %esi,-0x2c(%rbp)
movq %rdi,-0x38(%rbp)
leaq 0x26834d24(%rip),%rdi
callq 0x804d6 ; symbol stub for: pthread_mutex_lock
movq 0x26834ca0(%rip),%r13
testq %r13,%r13
je 0x5a17c ; <+383>
movl -0x2c(%rbp),%ebx
addq $0x8,-0x38(%rbp)
movslq 0x8(%r13),%r15
testq %r15,%r15
jle 0x5a16f ; <+370>
decq %r15
movq %r15,%r14
shlq $0x5,%r14
movl 0x10(%r13,%r14),%r12d
testl %r12d,%r12d
je 0x5a03d ; <+64>
cmpl $0x0,-0x2c(%rbp)
je 0x5a102 ; <+261>
cmpl $0x1,%r12d
je 0x5a0a4 ; <+167>
cmpl $0x3,%r12d
je 0x5a0d1 ; <+212>
cmpl $0x2,%r12d
jne 0x5a102 ; <+261>
movq 0x28(%r13,%rax
movq -0x38(%rbp),%rcx
xorl %edx,%edx
movq -0x8(%rcx),%rsi
cmpq %rax,%rsi
ja 0x5a096 ; <+153>
addq (%rcx),%rsi
ja 0x5a102 ; <+261>
incq %rdx
addq $0x10,%rcx
cmpq %rbx,%rdx
jb 0x5a085 ; <+136>
jmp 0x5a03d ; <+64>
movq 0x18(%r13,%rsi
ja 0x5a0c0 ; <+195>
addq (%rcx),%rdx
jb 0x5a0af ; <+178>
jmp 0x5a03d ; <+64>
movq 0x18(%r13,%rax
movq 0x10(%rax),%rsi
ja 0x5a0f1 ; <+244>
addq (%rcx),%rdx
jb 0x5a0e0 ; <+227>
jmp 0x5a03d ; <+64>
leaq 0x10(%r13,%rax
movl $0x0,(%rax)
movb $0x0,0x26834b94(%rip)
leaq 0x26834c25(%rip),%rdi
callq 0x804e2 ; symbol stub for: pthread_mutex_unlock
cmpl $0x1,%r12d
je 0x5a13e ; <+321>
cmpl $0x3,%r12d
je 0x5a145 ; <+328>
cmpl $0x2,%r12d
jne 0x5a14d ; <+336>
movq 0x20(%r13,%rdi
callq *0x18(%r13,%r14)
jmp 0x5a14d ; <+336>
callq *0x18(%r13,%r14)
jmp 0x5a14d ; <+336>
movq 0x18(%r13,%rdi
callq *0x10(%rdi)
leaq 0x26834bec(%rip),%rdi
callq 0x804d6 ; symbol stub for: pthread_mutex_lock
cmpb $0x0,0x26834b48(%rip)
je 0x5a03d ; <+64>
movq 0x26834b5b(%rip),%r13
jmp 0x5a173 ; <+374>
movq (%r13),%r13
jne 0x5a039 ; <+60>
leaq 0x26834bbd(%rip),%rdi
addq $0x18,%rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x804e2 ; symbol stub for: pthread_mutex_unlock
__cxa_finalize:
testq %rdi,%rdi
je 0x5a1c5 ; <+47>
pushq %rbp
movq %rsp,%rbp
subq $0x10,%rsp
leaq -0x10(%rbp),%rax
movq %rdi,(%rax)
movq $0x1,0x8(%rax)
movq %rax,%rdi
movl $0x1,%esi
callq 0x59ffd ; __cxa_finalize_ranges
addq $0x10,%rsp
popq %rbp
retq
xorl %edi,%edi
xorl %esi,%esi
jmp 0x59ffd ; __cxa_finalize_ranges
exit:
pushq %rbp
movq %rsp,%edi
callq 0x8000e ; symbol stub for: __exit
callq *%rax
ud2
_tlv_exit:
jmpq *0x2680cbd6(%rip)
pthread_getspecific:
movq %gs:(,%rdi,8),%rax
retq
解决方法
汇编输出只是编译器生成的可执行代码的转储,但以人类可读的形式 1 。编译器实际上并没有使用它,它只是编译过程中的一个构件,仅供参考。
请记住,已编译的可执行文件可以随时转换为汇编代码,IDA Pro和Ghidra之类的工具擅长在任何可执行文件上执行此操作,但是编译器可以添加丢失的上下文信息。最后的编译阶段是以注释或有用的标签形式。
编译器通常会为已编译的可执行文件发出调试提示,因此它可以将堆栈跟踪转换为映射回原始源代码的内容。这些工件更加有用,因为它们使您可以逐步执行C ++代码而不是汇编代码。如果您必须在库中进行调试,那么您就没有源代码,因为您会被困在逐步执行可执行代码的汇编视图中。
1 假定您可以阅读assembly code。
,您发布的代码是来自libc运行时的支持代码。运行时负责,尤其是:
- 实现atexit挂钩;
- 设置您的IO流(cin,cout);
- 运行任何全局静态变量的构造函数。
This answer具有更完整的概述。您可以搜索有关libc_start_main和相关功能的文章以了解更多信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。