使用 GHC 的 API 或提示从已编译的二进制文件导入已知函数

2023-11-27

我有一个模块Target,有一个函数Target.accessMe在里面。我以某种方式编译这个模块,然后删除源代码。

现在,我必须执行哪些神秘咒语才能动态导入不同的程序Target.accessMe?这个程序知道accessMe提前输入。另外,请考虑以下事实:Target不可用。

The plugins软件包设法实现了这一点,但在 Windows 上工作似乎存在严重问题。我已经结账了plugins的来源,但我无法理解它。

我尝试过使用Hint,但只能找出如何评估我拥有源代码的代码。

谢谢你的帮助!


这个问题的答案已经在其他地方给过我。 GHC API 能够做到这一点。这里有两个函数,其中一个可以编译Target.hs,而其他人访问Target.accessMe(并且不需要源代码Target模块不再存在)。

import GHC
import DynFlags

compile :: String -> IO SuccessFlag
compile name = defaultRunGhc $ do
  dynflags <- getSessionDynFlags
  let dynflags' = dynflags -- You can change various options here.
  setSessionDynFlags dynflags'

  -- (name) can be "Target.hs", "Target", etc.
  target <- guessTarget name Nothing
  addTarget target
  load LoadAllTargets -- Runs something like "ghc --make".

这是一个编译给定模块并返回编译是否成功的函数。它使用一个defaultRunGhc辅助函数定义为:

import GHC.Paths (libdir)

defaultRunGhc :: Ghc a -> IO a
defaultRunGhc = defaultErrorHandler defaultDynFlags . runGhc (Just libdir)

现在是一个用于从编译模块中获取值的函数。此时模块的源代码不需要存在。

import Unsafe.Coerce (unsafeCoerce)

fetch :: String -> String -> IO Int -- Assumes we are fetching an Int value.
fetch name value = defaultRunGhc $ do
  -- Again, you can change various options in dynflags here, as above.
  dynflags <- getSessionDynFlags
  let m = mkModule (thisPackage dynflags) (mkModuleName name)
  setContext [] [(m, Nothing)] -- Use setContext [] [m] for GHC<7.

  fetched <- compileExpr (name ++ "." ++ value) -- Fetching "Target.accessMe".
  return (unsafeCoerce fetched :: Int)

就是这样!

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

使用 GHC 的 API 或提示从已编译的二进制文件导入已知函数 的相关文章

  • 模式匹配需要圆括号来表示非空列表而不是方括号

    在 Haskell 中 为什么模式匹配期望列表在不为空时有圆括号而不是方括号 当它尝试与空列表 方括号 进行模式匹配时 为什么它不遵循相同的约定 圆括号不应该专门为元组保留吗 例如 下面不起作用 third Integral a gt a
  • Haskell 中的参数数量和无点 [重复]

    这个问题在这里已经有答案了 对于多重模式匹配 不同数量的参数是不可能的 即使是无点的 foo True b b 2 foo id 例如 不起作用 但 foo True 2 foo id 做 有时我们只能在函数的一部分使用 point fre
  • 测试列表是否已排序

    在 haskell 中找到最小列表确实很容易 foldl1 min 9 5 7 3 7 4 6 10 给我3 我更换了min with lt 测试列表是否已排序 foldl1 lt 9 5 7 3 7 4 6 10 我收到此错误消息 No
  • 为什么Haskell没有split函数? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在许多语言中 都有一个函数可以使用指定的分隔符将字符串分成几部分 它经常被称为split 您可以在 Python C Java JavaScri
  • 在 win32/cygwin 上编译 haskell 模块网络

    我正在尝试编译 Network HTTP http hackage haskell org package network http hackage haskell org package network 在 win32 cygwin 上
  • Control.Arrow 与 Data.Tuple.Extra

    我经常使用以下功能Data Tuple Extra图书馆 first second and both 有等效的 函数Control Arrow 其实我更喜欢Data Tuple Extra因为我完全迷失了文档Control Arrow 使用
  • 为什么这会导致 Haskell Conduit 库内存泄漏?

    我有一个conduit https hackage haskell org package conduit管道处理长文件 我想每 1000 条记录为用户打印一份进度报告 所以我这样写 Every n records perform the
  • 在 Haskell 中为自定义数据类型创建 Read 类型类的实例

    我有一个自定义数据类型Foo Foo a Int b Int 我正在尝试使 Foo 成为 read 的自定义实例 我已经有一个功能了bar String gt Foo我尝试这样做 instance Read Foo a b where re
  • 使用 Haskell 的欧拉项目 #1

    import Data Set euler Int euler sum x x lt nums where nums Data Set toList Data Set union Data Set fromList 3 6 999 Data
  • 可以通过Data.Function.fix来表达变形吗?

    我有这个可爱的fixana这里的函数执行速度比她的姐妹快 5 倍左右ana 我有一个criterion报告支持我这一点 ana alg Fix fmap ana alg alg fixana alg fix f gt Fix fmap f
  • Haskell printf 转字符串

    Haskell 中有等效的 sprintf 吗 我需要将双精度值转换并格式化为字符串 有没有其他方法而不使用printf什么样的功能 主要问题是要避免 Prelude gt putStrLn myDoubleVal 1 7944444444
  • 谁能解释一下 GHC 对 IO 的定义吗?

    标题非常自我描述 但有一个部分引起了我的注意 newtype IO a IO State RealWorld gt State RealWorld a 剥离newtype 我们得到 State RealWorld gt State Real
  • 如何获取常量内存中的统计数据

    我有一个函数 它会创建一些随机的数值结果 我知道 结果将是 a 小 a b 约 50 范围内的整数a b 我想创建一个执行上述函数 1000000 次的函数 并计算每个结果出现的频率 该函数使用随机生成器来生成结果 问题是 我不知道如何在常
  • “反向”使用 Maybe Monad

    假设我有很多功能 f a gt Maybe a g a gt Maybe a h a gt Maybe a 我想按以下方式组合它们 如果 f 返回 Nothing 则计算 g 如果 g 返回 Nothing 则计算 h 如果其中任何一个计算
  • 存在函数依赖关系时类型推断如何工作

    考虑下面的代码 LANGUAGE MultiParamTypeClasses FlexibleInstances FunctionalDependencies UndecidableInstances FlexibleContexts cl
  • Haskell 错误处理方法

    毫无疑问 Haskell 中有多种机制来处理错误并正确处理它们 错误单子 要么 也许 异常等 那么为什么用其他语言编写容易出现异常的代码比用 Haskell 感觉更简单呢 假设我想编写一个命令行工具来处理命令行上传递的文件 我想 验证提供的
  • 我应该使用什么递归方案来重复有效的操作,直到其结果符合某些标准?

    也就是说 我要问的是一个循环 effectful Int gt IO Int effectful n do putStrLn Effect show n return n condition 3 final Int gt IO final
  • 如何处理在组合下发生变化的类型?

    我最近读了一篇非常有趣的论文单调性类型 https infoscience epfl ch record 231867 files monotonicity types pdf其中描述了一种新的 HM 语言 该语言可以跟踪操作之间的单调性
  • Parsec 函数“parse”和类“Stream”的类型签名

    约束条件是什么 Stream s Identity t 下面的类型声明是什么意思 parse Stream s Identity t gt Parsec s a gt SourceName gt s gt Either ParseError
  • Haskell 类型定义,=> 等

    我正在使用 Learn You a Haskell 来学习 Haskell 第 54 页上有一个 像这样执行 take Num i Ord i gt i gt a gt a take n n lt 0 take take n x xs x

随机推荐

  • 如何在 Spring Security 中启用 POST、PUT 和 DELETE 方法

    我用 Spring Boot 开发了一个应用程序 运行良好 有一个安静的控制器 我尝试向某些页面添加 spring security 其余控制器的端点是 api greetings 我在下面的类中配置了安全设置 Configuration
  • 解析 xml 时出错:与 Facebook SDK 未绑定前缀

    我的项目无法识别 xml 中的 com facebook widget ProfilePictureView 或其他小部件 我导入了 facebook sdk 甚至用它来登录并与 open graph 交互 这一切都有效 我只是想添加一个个
  • 如何用D3添加简单的圆弧

    我想在图表部分添加一个简单的弧线 如圆 vis append circle style stroke gray style fill white attr r 40 attr cx 50 attr cy 50 所提供的D3的例子正在处理数据
  • 如何在for循环中使用setInterval函数

    我正在尝试在给定可变项目列表的情况下运行多个计时器 代码看起来像这样 var list Array for var x in list setInterval function list x 10 console log x gt list
  • 在堆栈跟踪中获取 VB.NET 行号

    我有一个 VB NET 2010 Winforms 应用程序 我想在堆栈跟踪中包含行号 我已阅读以下问题和答案 如何在VB net中运行应用程序时打印行号 其中提到 您始终需要在代码中包含 PDB 文件 其中包含在此类情况下使用的调试信息
  • Git 中的 commit-ish 和 tree-ish 是什么?

    问题 Git 中 commit ish 和 tree ish 的具体例子有哪些 堆栈溢出问题 git 中的 tree ish 是什么意思 交易 特别是树型 但我想了解更多both 背景 文档中的用法 Git 文档多次提到 commit is
  • Microsoft Edge window.open() 不支持宽度高度,并在后台打开

    我使用的是 Windows 10 预览版 Build 10130 并且window open新 Edge 浏览器中的方法的行为不符合规范 如果您使用示例代码https msdn microsoft com en us library ms5
  • 如何设置 Filezilla Pro 来访问我的 s3 存储桶?

    我购买了支持 Amazon S3 的 Filezilla Pro 请问如何设置 Filezilla Pro 访问我的存储桶 谢谢 对上述答案的一个重要补充 我的 S3 用户名和密码是什么 用户名 访问密钥 最好是仅具有访问特定 S3 存储桶
  • iPhone SDK 与静态库链接错误

    我已经构建了自己的静态库 其中包含要在项目中重用的组件 最近需要更新一堆类 具体来说 由于某些类更改了名称 某些方法的签名也发生了更改 现在发生的情况是 该库本身可以正常编译 但是 当添加到应用程序项目时 该项目无法链接 Ld build
  • javascript - 获取函数内异步函数的返回数据

    我遇到问题 因为 chrome api 函数是异步的 我无法获取其返回值 考虑以下代码 我正在使用 AngularJS scope storageGet function param var returnData chrome storag
  • 使用 itextsharp 阅读 PDF,其中 PDF 语言为非英语

    我正在尝试阅读thisPDF 使用 C 中的 itextsharp 将此 pdf 转换为 word 文件 它还需要维护Word中的表格格式和字体 当我尝试使用英语 pdf 时 它会完美工作 但使用一些印度语言 如印地语 马拉地语 时 它不起
  • jqgrid 添加行并将数据发送到 webservice 进行插入

    我已经能够使用 jQuery Ajax 将数据从 Web 服务中提取到 jQGrid 中 现在我想将添加 编辑的数据发送回网络服务 我已经看过一些使用 PHP 和 editurl 命令的示例 这也适用于网络服务吗 就像我最初提取数据的方式一
  • 使用 Reactive Banana 进行一些基本微积分

    Setup 我正在使用 Reactive Banana 和 OpenGL 并且我有一个想要旋转的齿轮 我有以下信号 bTime Behavior t Int the time in ms from start of rendering bA
  • SwiftUI UITextView 协调器不工作

    我包了一个UITextView in a UIViewRepresentable并包括一个Coordinator as UITextViewDelegate 但事件未被调用 我究竟做错了什么 struct TextView UIViewRe
  • Session ID 是在服务器端还是客户端生成的?

    这个网页http www w3schools com ASP prop sessionid asp表明会话 ID 是在服务器端生成的 如果是这种情况 那么服务器如何知道它在第二个请求响应周期仍然是同一个客户端 SessionId 肯定会在客
  • 安装 CMake 库:还为依赖项提供查找模块?

    我的 CMake 库 MyLibrary 具有依赖性OtherLibrary 我用一个导入非标准 FindOtherLibrary cmake 我的图书馆取决于OtherLibrary公开 target link libraries MyL
  • MVC4 区域和表单身份验证

    我有一个设置了多个区域的 MVC4 应用程序 每个区域必须有自己的登录页面 举例来说 我有以下领域 主要的 行政 如何设置才能使 主要 区域与 管理 区域具有不同的登录页面 我认为 web config 不是解决这个问题的方法 目前我的根
  • 如何在没有嵌套订阅的情况下订阅命令执行信号的完成?

    我尝试了以下操作但没有成功 等效使用 subscribeNext 按预期工作 A viewModel loginCommand executionSignals flatten subscribeCompleted NSLog A 我唯一的
  • 如何在r中从类别转换为数字

    这是我的问题 我有一个包含类别的表格 我想对它们进行排名 category dog cat fish dog dog 我想要的是添加一列并对它们进行排名 category rank dog 1 cat 2 fish 3 dog 1 dog
  • 使用 GHC 的 API 或提示从已编译的二进制文件导入已知函数

    我有一个模块Target 有一个函数Target accessMe在里面 我以某种方式编译这个模块 然后删除源代码 现在 我必须执行哪些神秘咒语才能动态导入不同的程序Target accessMe 这个程序知道accessMe提前输入 另外