GCC + LD + NDISASM = 大量汇编指令

2023-12-30

我是 C 和 GCC 编译器的新手,试图研究如何通过反汇编生成的二进制文件将 C 编译为机器代码,但编译然后反汇编一个非常简单的函数的结果似乎过于复杂。

I have basic.c file:

int my_function(){
    int a = 0xbaba;
    int b = 0xffaa;
    return a + b;
}

然后我使用编译它gcc -ffreestand -c basic.c -o basic.o

当我反汇编 basic.o 目标文件时,我得到了预期的输出:

0000000000000000 <my_function>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   c7 45 fc ba ba 00 00    movl   $0xbaba,-0x4(%rbp)
   b:   c7 45 f8 aa ff 00 00    movl   $0xffaa,-0x8(%rbp)
  12:   8b 55 fc                mov    -0x4(%rbp),%edx
  15:   8b 45 f8                mov    -0x8(%rbp),%eax
  18:   01 d0                   add    %edx,%eax
  1a:   5d                      pop    %rbp
  1b:   c3                      retq 

看起来很棒。但后来我使用链接器来生成原始二进制文件:ld -o basic.bin -Ttext 0x0 --oformat 二进制 basic.o

所以拆解之后基本.bin带命令的文件ndisasm -b 32 basic.bin > basic.dis,我在这里得到一些有趣的东西:

00000000  55                push ebp
00000001  48                dec eax
00000002  89E5              mov ebp,esp
00000004  C745FCBABA0000    mov dword [ebp-0x4],0xbaba
0000000B  C745F8AAFF0000    mov dword [ebp-0x8],0xffaa
00000012  8B55FC            mov edx,[ebp-0x4]
00000015  8B45F8            mov eax,[ebp-0x8]
00000018  01D0              add eax,edx
0000001A  5D                pop ebp
0000001B  C3                ret
0000001C  0000              add [eax],al
0000001E  0000              add [eax],al
00000020  1400              adc al,0x0
00000022  0000              add [eax],al
00000024  0000              add [eax],al
00000026  0000              add [eax],al
00000028  017A52            add [edx+0x52],edi
0000002B  0001              add [ecx],al
0000002D  7810              js 0x3f
0000002F  011B              add [ebx],ebx
00000031  0C07              or al,0x7
00000033  08900100001C      or [eax+0x1c000001],dl
00000039  0000              add [eax],al
0000003B  001C00            add [eax+eax],bl
0000003E  0000              add [eax],al
00000040  C0FFFF            sar bh,byte 0xff
00000043  FF1C00            call far [eax+eax]
00000046  0000              add [eax],al
00000048  00410E            add [ecx+0xe],al
0000004B  108602430D06      adc [esi+0x60d4302],al
00000051  57                push edi
00000052  0C07              or al,0x7
00000054  0800              or [eax],al
00000056  0000              add [eax],al

我真的不知道像 SAR、JS、DEC 这样的命令从哪里来以及为什么需要它们。我想,那是因为我为编译器或链接器指定了无效的参数。


正如我得出的结论@迈克尔·佩奇评论:

所需函数的二进制表示形式为00000000-0000001B反汇编文件的代码片段行并执行命令ret最后所以文件的第二部分(0000001B-00000056) 永远不会被执行 - 它是元数据。

As per @迈克尔·佩奇 and @Jester评论:

我可以看出目标文件由许多部分组成https://en.wikipedia.org/wiki/Object_file https://en.wikipedia.org/wiki/Object_file生成的 basic.o 文件最初包含三个部分:

  • .text(函数本身)
  • .comment(未在二进制文件中表示)
  • .eh_frame

什么是 .eh_frame 部分以及 GCC 编译器创建它的原因,如下所述:为什么GCC编译的C程序需要.eh_frame部分? https://stackoverflow.com/questions/26300819/why-gcc-compiled-c-program-needs-eh-frame-section

通过带参数运行 gcc-fno-异步展开表我可以从目标文件中删除 .eh_frame 部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC + LD + NDISASM = 大量汇编指令 的相关文章

  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var

随机推荐

  • 总结不同格式日期的小时数。 C#

    我有个问题 我需要用代码总结在办公室的工作时间 我从 SQL Server 获取的日期没有问题 但我有不同的格式 例如 2019 09 23 14 54 23 2019 09 23 14 54 23 or 2019 09 23 14 54
  • Android volley 在所有请求完成时获取回调

    我正在使用 volley 对一系列请求进行排队 当这些请求发生时 我向用户显示一个进度对话框 有没有办法可以检查所有这些请求何时完成 这就是我要的 Show progress bar for int i 0 i
  • std::is_same 结果与左值和右值引用

    我正在将 std is same 实用程序函数与右值和左值引用结合使用 并遇到了奇怪的行为 考虑这个检查变量 t 类型的函数模板 我正在使用 VS 2013 struct Test template lt class T gt void h
  • 使用子进程从 python 执行时,ssh 未被识别为命令?

    这是我的代码 import subprocess import sys HOST xyz3511 uhc com Ports are handled in ssh config since we use OpenSSH COMMAND up
  • jQuery 将小数添加到 SELECT,没有重复项并可选择删除

    好的 这里是 需要过滤掉重复项并能够删除添加到选择框的值 Number
  • 检测 Vue-Router 导航卫士中的后退按钮

    路线如何改变对于我的情况很重要 所以 我想捕捉浏览器或 gsm 的后退按钮何时更改路线 这就是我所拥有的 router beforeEach to from next gt if IsItABackButton from meta some
  • Javascript 文件组织和设计

    真正进入 Web 开发 特别是 JS 所以我想知道 JS 文件组织和职责委派方面的最佳实践是什么 我问这个是因为这种结构对我来说是有意义的 主页 PHP 包括对中央 JS 文件的引用 MAIN Javascript 文件 包括对仅包含命名空
  • 点击 linkedin 的 http get 请求,在 Angular 2 中给出错误

    我正在使用 linkedin 进行注册 需要获取访问代码和基本个人资料详细信息 但是当我发布请求时 我的控制台中出现 CORS 错误 当我直接在浏览器中点击 URL 时 它会将我正确地带到登录页面 满足请求会出现什么问题 CORS 问题已解
  • 允许国际字符的弹出式虚拟键盘

    我正在为我们正在开发的应用程序寻找特定的 Javascript 解决方案 我们其实曾经拥有过它 但我们已经失去了它 捂脸 发生的事情如下 单击键盘图像 弹出虚拟键盘 允许用户选择一堆国际按键 例如德国的变音符号 塞尔维亚语的西里尔字母等 我
  • 冬眠。 PSQLException:int 类型的错误值:admin

    我有一个带有 JAVA 和 Hibernate 的桌面应用程序4 3 1 现在我只有两个实体 用户和角色 User ManyToOne fetch FetchType LAZY Fetch FetchMode JOIN JoinColumn
  • NgMap 集群在缩放后更改标记颜色

    我想改变标记的颜色 我在用着ng map显示地图 我还在这个库中使用集群选项 我的问题 我可以更改标记颜色并且可以看到这一点 但是一旦开始缩放 标记颜色就会更改为默认颜色 红色 这是我的代码
  • Twitter 请求令牌 OAuth 401 错误

    尝试使用 OAuth 添加 twitter 登录 但请求令牌的第一步是一场噩梦 这会一如既往地导致 401 错误 我使用 twitter 的 Test OAuth 工具来比较我的 scala 服务器发送的 http 请求 Curl要求wor
  • 设置 Excel 单元格格式(货币)

    我开发了一个 Excel 插件 这样您就可以将 MySQL 数据库中的一些数字插入到特定单元格中 现在我尝试将这些单元格格式化为货币 但遇到两个问题 1 在格式化单元格上使用公式时 总和显示如下 353 2574 欧元 我需要做什么才能以适
  • 在 C++ 中读取大型 .txt 文件时出现奇怪的错误[重复]

    这个问题在这里已经有答案了 我正在尝试读取一个非常大的 txt 文件 该文件有 128x128x128 2097152 行 线性化 3d 空间 其中仅包含一个 0 或 1 行 不要问为什么 我将代码缩减为几行似乎当我计算行和增量时 一切都很
  • WPF 嵌套用户控件绑定

    我正在尝试将一个值从 Window 绑定到 UserControl 内的 UserControl 中 但是 由于某种原因 据我所知 内部 UserControl 甚至从未尝试绑定 主窗口 xaml
  • NameValueCollection 到 URL 查询?

    我知道我能做到 var nv HttpUtility ParseQueryString req RawUrl 但是有没有办法将其转换回 url 呢 var newUrl HttpUtility Something page nv 只需致电T
  • 关于 scala 私有字段变量的困惑

    我已经进入 Scala 学习的第三天了 使用书 开始scala 作者用一个例子来展示带 val var 和不带 var val 的变量定义之间的区别 class Book private val title String def print
  • 如何在 IntelliJ 中运行角度应用程序

    我正在按照 IntelliJ 中的步骤来支持 Angular https www jetbrains com help idea 2017 1 using angular html install angular cli https www
  • 如何在python中用null之前的所有前一个值和null之后的第一个后继值的平均值填充null值?

    I have a dataframe with 5000 records I want the null values to be filled with 平均值 null 之前的所有前一个值 null 之后的第一个后继值 data Dat
  • GCC + LD + NDISASM = 大量汇编指令

    我是 C 和 GCC 编译器的新手 试图研究如何通过反汇编生成的二进制文件将 C 编译为机器代码 但编译然后反汇编一个非常简单的函数的结果似乎过于复杂 I have basic c file int my function int a 0x