这些说明在拆装阶段有什么指示?

问题描述

你好,当我在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 ProGhidra之类的工具擅长在任何可执行文件上执行此操作,但是编译器可以添加丢失的上下文信息。最后的编译阶段是以注释或有用的标签形式。

编译器通常会为已编译的可执行文件发出调试提示,因此它可以将堆栈跟踪转换为映射回原始源代码的内容。这些工件更加有用,因为它们使您可以逐步执行C ++代码而不是汇编代码。如果您必须在库中进行调试,那么您就没有源代码,因为您会被困在逐步执行可执行代码的汇编视图中。


1 假定您可以阅读assembly code

,

您发布的代码是来自libc运行时的支持代码。运行时负责,尤其是:

  • 实现atexit挂钩;
  • 设置您的IO流(cin,cout);
  • 运行任何全局静态变量的构造函数。

This answer具有更完整的概述。您可以搜索有关libc_start_main和相关功能的文章以了解更多信息。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...