如何在C/C++中存储和调用已编译的函数?

2024-01-29

对于非常低级别的优化目的,如果我可以将编译后的函数直接存储在变量中,这对我很有用,not指向函数的指针。也就是说,如果我有一个函数 foo,我想创建一个足够大的 char 缓冲区来容纳为 foo 生成的机器指令,然后能够通过某种方式告诉 C 将执行跳转到该缓冲区的内容来有效调用 foo (假设我有一个编译器内在功能来确保字符缓冲区针对我的体系结构正确对齐)。理想情况下,我想这样做,将程序集的使用量保持在最低限度(我意识到可能需要一些程序集)。

到目前为止,我最好的解决方案是编译一个程序,该程序只有我想用 GCC 汇编的功能,然后编译为机器代码,然后使用输出程序集中的地址从可执行文件中提取所需的机器代码,然后手动填充缓冲区与我的程序中的缓冲区相同,然后使用内联汇编跳转到缓冲区的起始地址。但这比我想要的更麻烦和手动工作。

我不需要在运行时编译新函数,只需让缓冲区包含与运行时不同的已编译函数相对应的指令即可。例如。我可能有 3 个编译函数和 1 个缓冲区。这 3 个函数在编译时是已知的,但在运行时缓冲区可能在不同时间对应于这 3 个函数中的任何一个。

编辑:为了澄清将会获得什么:我有一个该缓冲区将成为其成员的结构,以及指向该结构实例的各种指针。每个结构体的缓冲区可能包含不同的编译函数。如果我要使用函数指针而不是缓冲区,则必须加载结构体的函数指针,然后取消引用函数指针。有了缓冲区,我可以将程序计数器跳转到结构体基址的偏移量(缓冲区的相对位置)。这是少了一层间接性。对于非常小的函数,这可以节省成本。

编辑2:进一步澄清:

使用函数指针:

  1. 从 &struct+offsetof(pointer) 加载指针
  2. 跳转到指针所包含的位置

使用包含机器代码的缓冲区:

  1. 跳转到 &struct+offsetof(buffer)

第二个是步骤少。


请注意,大多数现代体系结构都支持内存页面的不执行保护,并且具有一定意义的操作系统会利用它来确保安全。这意味着您不能使用例如堆栈内存或随机分配的内存来存储此代码;您需要使用例如调整权限VirtualProtect在 Windows 或mprotect在Unices上。

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

如何在C/C++中存储和调用已编译的函数? 的相关文章

随机推荐

  • 二元运算符重载;隐式类型转换

    class my bool private bool value public my bool bool value value value operator bool friend my bool operator const my bo
  • 在 Perl 中从 STDIN 捕获退出状态

    我有一个使用如下命令运行的 perl 脚本 path to binary executable path to perl script pl 该脚本对二进制文件的输出执行有用的操作 然后在 STDIN 用完后退出 返回 undef 这一切都
  • 创建一个Java洗牌程序

    我正在尝试在java中创建一个洗牌器 通过执行进出洗牌来执行 完美洗牌 将牌分成两半并交错每张牌 然后再重复一次 我有以下代码来执行随机播放 public class Shuffle private static final int shu
  • ionic 3 模态单模态全屏宽度/高度?

    我正在使用 ionic 模态 我想将我的模态大小调整为全屏 不是所有模态 而是只有 1 个模态 但无法实现此目的 因为 ionic 本身正在设置宽度 高度属性 重要的属性 我尝试过类似以下内容 media only screen and o
  • IE7 Z-Index 问题(CSS DropDown)

    我已经尝试使用 JQuery 和 CSS Tricks 进行了一些不同的修复 但我似乎无法将下拉菜单置于 IE7 中的手风琴滑块之上 它似乎在任何其他网络浏览器中都能正常工作 任何帮助将不胜感激 代码片段 HTML div class sh
  • 具有预编码 H.264 视频流的 Android WebRTC 客户端

    我有一个发送 H 264 编码视频字节的视频流源 我想使用 Android 的 WebRTC 类构建一个应用程序 将此视频流发送到 WebRTC 对等点 这些内置类似乎只支持原始视频源 而不支持已由编解码器处理的视频 我只需要创建仅包含一种
  • Firefox Safari chrome 等中的 window.createPopup() 相当于什么

    看来我无法在其他浏览器上使用 window createpopup 因为它不受支持 我使用 window createpopup 的原因是因为它可以从一个框架弹出并显示在同一页面上的另一个框架的顶部 我正在使用框架集 因此其他类型的下拉菜单
  • iOS 9 启动画面为黑色

    升级到 iOS 9 后 我的应用程序的启动屏幕全是纯黑色 有人知道这是为什么吗 其中一些使用 xib 初始屏幕 一些使用图像 但现在它们都是黑色的 是否必须使用 Xcode 7 构建应用程序才能使启动屏幕在 iOS9 中工作 有没有人看过一
  • 从 Codeigniter 中的 Active record 获取 SUM 和 group 字段的结果

    我需要在 Codeigniter 中构建此查询 但我不知道如何获取 SUM 的结果 SELECT description SUM amount FROM PAYMENT WHERE date payment between 2014 02
  • Kubernetes RBAC - 禁止尝试授予额外权限

    我在用着Kubernetesv1 8 14 定制版CoreOS簇 kubectl version short Client Version v1 10 5 Server Version v1 8 14 coreos 0 当尝试创建以下内容时
  • Docker:如何重新启动容器内的进程?

    我有一组测试 我想在 docker 容器上运行 在测试过程中 我正在更改测试数据 并且需要重新启动 JETTY 最好的方法是什么 我可以想象一些选择 使用 SSH 但对于 docker 来说 ssh 并不是最好的选择 docker 上的 P
  • 使用 sorttable.js 对表自动排序

    我正在尝试使用此脚本对 html 表进行排序 http www kryogenix org code browser sorttable http www kryogenix org code browser sorttable JS代码本
  • event.preventDefault();提交表单时不起作用

    我正在尝试将提交的表单的结果放入div而不是在新窗口中打开它 问题是我的event preventDefault 似乎不起作用 我不明白为什么 结果 在我点击提交按钮后总是打开contact form handler php 这是脚本文件
  • 在 Delphi 中使用 SSL 但仍然只有一个 exe

    我们使用 Indy 并且需要在我们的应用程序中支持 SSL 电子邮件 但是我们需要将我们的应用程序放在单个 Exe 中 我们知道默认的 Indy 处理程序要求路径中包含 dll 从 EXE 资源之一中提取 Dll 将是最后的手段 还有更好的
  • CIColorControls 和 UISlider w/Swift 4 [重复]

    这个问题在这里已经有答案了 我试图让滑块影响 UIImageView 的亮度 我的出路和行动 IBOutlet weak var previewImage UIImageView IBAction func adjustBrightness
  • AngularJs 嵌套 ng-repeat 过滤器

    我有一个要过滤的分组嵌套对象 该过滤器仅适用于第二组
  • 如何查找sql​​ server中一个表的所有依赖关系

    我有一个数据库 其中有表 过程 视图和触发器的列表 但我想要一个查询来获取表的所有依赖项 包括引用父表的子表 我们可以使用以下方法来检查依赖关系 方法一 使用sp depends sp depends dbo First GO 方法二 使用
  • SQL Server 自动标识字段的最大大小

    SQL Server 标识字段 int 的最大大小是多少 我每天会在几个表中多次删除和插入数百条记录 我很好奇这会对自动身份字段产生什么影响 我可以每天晚上左右运行一项作业 并根据需要截断这些数据 我很感激你的想法 谢谢 INT 最多可达
  • 圆形 div 中的文本溢出

    我有一个圆形 div 但我的文本不在其中 默认情况下它略高于我无法查明原因 我在顶部添加了边距以将其强制放在 div 内 但我确信有更好的方法来执行此操作 因为我的方法仅适用于一定数量的文本 div description display
  • 如何在C/C++中存储和调用已编译的函数?

    对于非常低级别的优化目的 如果我可以将编译后的函数直接存储在变量中 这对我很有用 not指向函数的指针 也就是说 如果我有一个函数 foo 我想创建一个足够大的 char 缓冲区来容纳为 foo 生成的机器指令 然后能够通过某种方式告诉 C