Ocaml cmi文件---获取功能签名

时间:2013-12-09 16:11:41

标签: compilation ocaml reverse-engineering

我有以下问题。我正在玩OCaml类型检查器,并正在测试来自另一个项目的文件。但是,这些文件依赖于某些先前编译器版本编译的cmi和cmo文件。因此,我无法使用我的编译器完全检查这些文件,因为它似乎无法识别那些cmo和cmi文件。有办法解决这个问题吗?

请注意,我无法切换到旧的编译器版本,并且我没有这些cmo和cmi文件的源代码。我想到查看OCaml文件,推断函数签名,并创建具有相同签名的新cmi和cmo文件。这可能会起作用,因为我只对类型检查感兴趣。但是,我认为可能有更好的方法。

2 个答案:

答案 0 :(得分:2)

如果您对旧OCaml编译器编译模块的类型纯粹感兴趣,那么最好的选择是:

  • 下载相应的旧OCaml编译器源代码
  • 使用旧的OCaml代码构建一个小工具来加载cmi文件并将签名转储到文本中。如果您习惯于OCaml编译器内部,则可以在一小时内完成。
  • 使用工具
  • 将cmi文件的签名提取到mli文件
  • 通过新编译器键入mli文件并为新编译器创建cmi文件

复制旧的cmo文件应该更加困难。我担心,将它们与固定的cmi文件链接应该会产生意想不到的结果。从理论上讲,可以将cmo文件反编译为ml源代码--- js_of_ocaml可以反编译cmo并创建(以某种方式)可读的JavaScript,但这是一项艰巨的任务。

答案 1 :(得分:1)

显而易见的是使用新编译器编译文件,而不是仅查看它们。也许这太明显了,对不起。

我不知道任何转储cmi文件接口的工具。最接近的是ocamlobjinfo,但它远远不够。您可以尝试将cmo文件加载到旧的顶层。顶层将告诉您值的类型。