为什么 gcc 会生成没有标志 -fno-pie 的奇怪代码?

2023-12-09

我正在尝试使用标志 -fno-pie 和不使用标志 -fno-pie 在 gcc 中编译虚拟函数。

void dummy_test_entrypoint() { }

当我在没有标志的情况下编译时。

gcc -m32 -ffreestanding -c test.c -o test.o

我得到以下反汇编代码。

00000000 <dummy_test_entrypoint>:
0:  55                      push   ebp
1:  89 e5                   mov    ebp,esp
3:  e8 fc ff ff ff          call   4 <dummy_test_entrypoint+0x4>
8:  05 01 00 00 00          add    eax,0x1
d:  90                      nop
e:  5d                      pop    ebp
f:  c3                      ret    

当我用标志编译时。

00000000 <dummy_test_entrypoint>:
0:  55                      push   ebp
1:  89 e5                   mov    ebp,esp
3:  90                      nop
4:  5d                      pop    ebp
5:  c3                      ret 

我的问题。

它是什么???

3:  e8 fc ff ff ff          call   4 <dummy_test_entrypoint+0x4>
8:  05 01 00 00 00          add    eax,0x1

您反汇编了目标文件而没有--reloc标志,因此输出具有误导性。随着--reloc标志,你会看到这个:

   3:   e8 fc ff ff ff          call   4 <dummy_test_entrypoint+0x4>
            4: R_386_PC32   __x86.get_pc_thunk.ax
   8:   05 01 00 00 00          add    $0x1,%eax
            9: R_386_GOTPC  _GLOBAL_OFFSET_TABLE_

子程序如下所示:

00000000 <__x86.get_pc_thunk.ax>:
   0:   8b 04 24                mov    (%esp),%eax
   3:   c3                      ret    

该结构将 GOT 指针加载到%eax,以防函数需要引用全局数据。该函数不包含这样的引用,但是因为您编译代码时没有优化,所以GCC没有删除死代码。

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

为什么 gcc 会生成没有标志 -fno-pie 的奇怪代码? 的相关文章

随机推荐

  • Flutter:如何在Swiper中完成特定逻辑后显示下一个索引,其中GridView也在Swiper中设置?

    我正在尝试制作一个文字游戏 首先 索引将是白色的 如果用户单击正确的答案 则索引将变为绿色并进入下一个屏幕 并且下一个屏幕中的索引将为白色 再次 如果用户单击不正确的答案 则索引将变为红色 并且不要放开下一页直到用户输入正确答案 我在 Sw
  • 使用 SpongyCastle 的 PKCS#10 客户端证书创建 Https 连接

    The goal 我正在努力实现与客户端证书的通信 步骤 1 创建 PKCS 10 请求 CSR 并将其交给我的服务器进行签名 服务器联系人将 CSR 传递给 CA CA 对其进行签名 并返回 PKCS 7 带有签名的 PKCS 10 和
  • 如何在 Netbeans 中添加 Scala 平台?

    我已经为netbeans安装了一套Scala插件 具体来说 Scala 控制台 项目 运行时库 平台 平台标准 编辑器 调试器项目集成 重构 调试器 核心 和 Rats Packrat 解析器 我还通过 ubuntu aptitude 包管
  • 防止多列布局中的元素碎片

    鉴于此代码 wrapper border 2px solid red padding 10px width 310px height 310px webkit column width 150px webkit column gap 10p
  • PHP 写入文件

    下面是我用来将地图数组 翻译 为 SQL 代码的一些代码 以便在更新游戏地图时可以轻松更新数据库 正如您所看到的 它将 SQL 代码打印到屏幕上 以便我可以复制并粘贴它 随着我的地图变得更大 这将变得效率低下 因为它会因大量输出而使浏览器崩
  • Antlr4:输入不匹配

    这是一个简单的语法测试 我认为很容易解析 但我立即得到 不匹配的输入 并且我无法弄清楚 Antlr 正在寻找什么 输入 include something program TEST1 BLAH BLAH 我的语法 grammar ProgH
  • 从字符串转换日期和/或时间时转换失败

    我有这个查询 set IDENTITY INSERT dbo OtherData1 ON INSERT INTO OtherData1 OtherDataID EmployeeID OtherDate OType OSubject Stat
  • Sphinx 内联包括

    我想使用 include 函数内联 但只有当我用两行新行与前面的文本分开时 我才能让它实际包含我想要的文件 在有人问之前 我想包含的文件是一个协议号 所以不 它根本不会从新行中受益 我希望能够轻松更改它 以便我可以在文档的多个位置使用它 我
  • Perl 中的 yyyymmddhhmmss 到 YYYY-MM-DD hh:mm:ss?

    在 perl 中将 yyyymmddhhmmss 转换为 YYYY MM DD hh mm ss 并返回的最佳方法是什么 例如 20130218165601 到 2013 02 18 16 56 01 并返回 能https metacpan
  • 颜色树状图根据外部标签向根向上分支,直到标签匹配

    来自问题使用现有列的树状图的颜色分支 我可以为树状图叶子附近的分支着色 代码 x lt 1 100 dim x lt c 10 10 set seed 1 groups lt c red red red red blue blue blue
  • 如何填补自增字段的“洞”?

    我读过一些关于此的文章 但没有一篇涉及这个问题 我想这是不可能的 但我还是会问 我有一个包含 50 000 多个寄存器的表 这是一个旧表 其中发生了各种插入 删除操作 也就是说 大约 300 个寄存器中存在各种 漏洞 即 1340 1341
  • 打包java应用程序

    我有一个 java 应用程序 从中构建了一个依赖于许多第三方 jar 的 jar 打包该应用程序以供最终用户分发的最佳 常见方法是什么 最好的方法是使用像这样的构建工具Maven2或类似的东西 并使用它来管理您的依赖项并构建一个一体化的包
  • R 中 2 个 DTM 的余弦相似度

    我有 2 个文档术语矩阵 DTM 1 有 1000 个向量 1000 个文档 并且 DTM2 有 20 个向量 20 个文档 所以基本上我想将 DTM1 的每个文档与 DTM2 进行比较 并希望使用余弦函数查看哪些 DTM1 文档与哪些 D
  • C# - 不时检查文件是否存在并从中读取

    我创建一个 Windows 服务 它会不时检查某个文件是否存在 如果存在 然后从中读取数据 将数据发送到服务器并将文件移动到另一个文件夹 文件大小约为 1 3 Mb 我想我会用System Threading Timer此处检查文件是否存在
  • 字符串中第一个数字用“*”分隔字符串

    我认为这是一个简单的问题 但我看不出我错过了什么 我想在第一个数字处分割字符串 在字符串中存在非字母数字符号之前效果很好 帮助 Works pet lt c Dog 100 Cat 340 df lt as data frame pet d
  • 在C++中使用线程交替打印奇数和偶数

    使用线程打印奇偶数我遇到了这个问题并想讨论 C 中的解决方案 我能想到使用2个二进制信号量奇数和偶数信号量 偶数信号量初始化为 1 奇数信号量初始化为 0 T1 thread function funOdd wait even print
  • MySQL默认时间格式UTC还是GMT?

    嗨 我对 UTC 和 GMT 很困惑 我在 MySQL 表中插入前列 event date 例如 2010 07 01 23 50 00 日期时间 我的客户在前端询问选项为 GMT 1 GMT 2 GMT 1 GMT 2 等等 如果我选择任
  • 如何在 Mediawiki 中检查用户是否是使用 Php 的 Sysop?

    我正在尝试向侧边栏添加一个 div 并且我只希望此块向管理员显示 php 如何检查用户是否是管理员 我正在尝试将其添加到 myskin php 文件中 但不知道该怎么做 我一直在使用类似的东西来检查用户是否登录 有没有类似的东西来检查该用户
  • React-Router v6 未在生产环境中渲染

    我在这个问题上已经失去了智慧 希望有任何想法可以让我走上正轨 我已经实现了一个 React js SPA 它使用react router domv6 来浏览应用程序功能 该应用程序在我的本地主机上完美运行 当部署到生产中时
  • 为什么 gcc 会生成没有标志 -fno-pie 的奇怪代码?

    我正在尝试使用标志 fno pie 和不使用标志 fno pie 在 gcc 中编译虚拟函数 void dummy test entrypoint 当我在没有标志的情况下编译时 gcc m32 ffreestanding c test c