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

如何解决这些说明在拆装阶段有什么指示?

你好,当我在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和相关功能的文章以了解更多信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-