消除GOT寄存器的冗余负载?

2023-12-14

我正在处理一些在编译为 PIC(位置无关代码)时速度慢 70-80% 的代码,并寻找缓解该问题的方法。问题的一个重要部分是 gcc 坚持在每个函数中插入以下内容:

call __i686.get_pc_thunk.bx
addl $_GLOBAL_OFFSET_TABLE_,%ebx

即使这最终占了函数内容的 20%。现在,ebx是一个调用保留寄存器,并且every相关翻译单元(源文件)中的函数正在用GOT的地址加载它,并且很容易检测到static函数不能从翻译单元外部调用(它们的地址永远不会被占用)。那么为什么 gcc 不能直接加载ebx一旦在大的外部链接函数的开头,并生成静态链接函数,以便它们假设ebx是否已经加载了GOT的地址?我是否可以使用任何优化标志来强制 gcc 进行这种明显且大规模的优化,而不是将内联限制提高到天高,以便所有内容都内联到外部函数中?


可能没有通用的解决方法,但您可以尝试使用内联选项。我猜想static编译单元中的函数没有太多的调用者,因此代码复制的开销不会太糟糕。

使用 gcc 强制执行此类操作的最简单方法是设置attribute((always_inline))。您可以使用 gcc 相关宏来确保可移植性。

如果你不想修改代码(但是static inline无论如何都会很好)你可以使用-finline-limit选项来微调。

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

消除GOT寄存器的冗余负载? 的相关文章

  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • js中通过窗口名称进行窗口到窗口通信

    有谁可以给 我一些关于如何使用 javascript 处理窗口到窗口通信的想法 因为这两个窗口没有父子关系 基本上另一个窗口是使用 window open 方法打开的 任何精彩的信息都将受到高度赞赏 假设如下 windowHandle wi
  • 由于 R 中的大整数日期时间,线性模型奇异?

    日期随机正态的简单回归失败 但使用小整数而不是日期的相同数据可以按预期工作 Example dataset with 100 observations at 2 second intervals set seed 1 df lt data
  • 如何在 MySQL 中使用命令行导入 SQL 文件?

    我有一个 sql导出的文件phpMyAdmin 我想使用命令行将其导入到不同的服务器中 我有一个Windows Server 2008R2安装 我把 sql文件上的C drive 我尝试了这个命令 database name lt file
  • 使用 C# 将 Word 文件(.docx 和 doc)转换为 .pdf 不起作用

    我正在使用 Visualstudio 2010 我正在尝试将 word docx 文件转换为 pdf 文件 并且在本地工作正常 但在服务器上运行时显示错误为 Could not load file or assembly office Ve
  • WooCommerce 价格覆盖不起作用

    我已经使用设置了一个隐藏的输入项woocommerce before add to cart button hook function add gift wrap field gt
  • 在R闪亮的页面加载时调用javascript函数

    我添加了对 css 和 javascript 文件的引用 如下所示 tags link rel stylesheet type text css href rtp css tags script type text javascript s
  • QOpenGLWidget更新如何不会导致paintGL事件?

    我正在记录呼叫update and paintGL 但不知何故 只发生更新 PaintGL 被调用了几次 然后就再也没有调用过 这怎么可能 窗口是可见的并且isVisible 每次都返回 Trueupdate 叫做 具体来说 我从QGLWi
  • Ghub 脚本:向下拖动鼠标并按鼠标左键(LUA)自动点击

    所以基本上我试图使用 Ghub Lua 脚本机制来解释标题中的内容 发布下面我所拥有的代码 EnablePrimaryMouseButtonEvents true function OnEvent event arg if IsKeyLoc
  • java中的单词高亮显示

    我想针对特定的情况突出显示这些词time 就像卡拉 OK 应用程序一样 每个单词都有一个特定的突出显示时间 我可以计时 但不知道在哪里 如何在特定的持续时间内突出显示一个单词 在 stackoverflow 和 google 上搜索了很多
  • 在 Azure Function 中安装 Powershell 模块

    我将 Azure Function 2 0 与 Powershell 结合使用 并在安装 Powershell 模块时出现以下错误 有什么办法可以消除这个错误 一般来说 我们不需要管理员权限来安装 NuGet 依赖项 I also trie
  • Reactjs:意外的标记“<”错误

    我刚刚开始使用 Reactjs 正在编写一个简单的组件来显示 li标记并遇到此错误 意外的标记 我已将示例放在下面的 jsbin 中http jsbin com UWOquRA 1 edit html js 控制台 输出 请让我知道我做错了
  • 获取所有打开的 Excel 文档

    我需要使用自己的数据创建 xls 文件 但文件可能已被创建并由用户打开 1 如果文件不存在 新的应用程序类 工作簿 Add 另存为 2 如果文件存在且未打开 没问题 转到 1 3 如果文件存在并且被用户打开 需要找到它的工作簿并修改工作表的
  • PyQT:旋转 QLabel,使其定位在对角线上而不是水平定位

    我正在开发一个触摸屏应用程序 其中图形用户界面空间非常紧张 我想稍微旋转 QLabel 使其垂直或在对角线上稍微偏移 有什么建议么 我在 QLabel 界面上找不到任何相关内容 非常感谢 QLabel不这样做 但您可以轻松创建自己的包含一些
  • 使用 CSS3 过渡对不可设置动画的属性进行动画处理

    在我的应用程序中 我使用以下内容对页面上元素的不透明度进行动画处理 s transition property opacity transition duration 250ms 当然 有特定于供应商的版本 进而 s hidden opac
  • 标签是 XHTML 中的块级元素吗?

    我知道在HTML4 0中 p tag 不是块级元素 那么在 XHTML 1 0 中呢 谢谢 这是HTML4 0的参考http www w3 org TR html401 struct text html P 元素代表一个段落 它不能包含块级
  • 面向非美国开发者的 Paypal Android SDK

    我是一名非美国开发人员 正在构建一个也可以在美国境外运行的 Android 应用程序 我搜索了一段时间有关 Android SDK 何时在美国境外可用的信息 但没有找到任何信息 我正在寻找一种将 Paypal 支付与我的应用程序集成的方法
  • Unix 文件名中应限制哪些字符?

    考虑一个Save As带有自由文本条目的对话框 用户可以在其中输入文件名作为自由文本 然后单击Save按钮 然后 软件会验证文件名 如果名称有效则保存文件 在 Unix 文件系统上 验证中应应用哪些规则 以后在转义特殊字符等方面操作该名称并
  • 找不到管道“safeResourceUrl”

    由于我正在尝试将 YouTube 视频动态嵌入到我的 Angular 2 应用程序中 因此正在努力解决一些安全错误 在这里找到了关于使用 Pipe 来清理 url 的答案 但是遇到这个当前错误 找不到管道 safeResourceUrl S
  • Java加载二进制文件

    请告诉我最好 最快的方法 1 将非常小的二进制文件加载到内存中 例如图标 2 加载 读取大小为 512Mb 的非常大的二进制文件 也许我必须使用内存映射IO 3 当您不想考虑大小 速度而只需要做一件事时 您的常见选择 将所有字节读入内存 谢
  • 消除GOT寄存器的冗余负载?

    我正在处理一些在编译为 PIC 位置无关代码 时速度慢 70 80 的代码 并寻找缓解该问题的方法 问题的一个重要部分是 gcc 坚持在每个函数中插入以下内容 call i686 get pc thunk bx addl GLOBAL OF