如何在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++中存储和调用已编译的函数? 的相关文章

  • 在 C++ 中使用 matlab 结构(matlab 函数调用的返回值)(由 matlab 编译器生成的库)

    你好 我有一个相当简单的 matlab 函数 例如 function MYSTRUCT myfunc MYSTRUCT prop1 test MYSTRUCT prop2 foo MYSTRUCT prop3 42 end 我用 matla
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 打印数字时添加千位分隔符[重复]

    这个问题在这里已经有答案了 我真的不知道这个问题的 名称 所以它可能是一个不正确的标题 但问题很简单 如果我有一个数字 例如 number 23543 second 68471243 我想要它使print 像这样 23 54368 471
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • Nasm 点状标签

    我对 TASM 很熟悉 但对 NASM 不太了解 我读过 NASM 允许使用本地标签 这些标签在名称前用点表示 例如 代码 loop some code jmp loop 定义一个名为 loop的局部标号 引用的地址在后面的jmp指令中使用
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 当我使用 OpenSSL1.1.0g 根据固定的 p 和 g 值创建 Diffie Hellman 密钥协议密钥时,应该执行哪些检查?

    您好 我尝试通过这段代码使用修复 p 和 g 参数来制作 Diffie Hellman Keysanswer https stackoverflow com a 54538811 4706711 include

随机推荐

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

    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