如何在字节码可执行文件和ocamlrun之间嵌入和分隔二进制文件?

二进制是指字节码和本机代码.

我已经构建了一个仅依赖于标准库的程序,使用带有最小标志集的ocamlbuild:

ocamlbuild -I … -use-ocamlfind -libs str program.byte

它运行正常.仅供参考,我使用OCaml 4.02.1,Mac OS X Mountain Lion.

使用ocamlobjinfo program.byte,我可以看到它的内容概述:

…
Imported units:
        9c1885d2c36e2eb94f56f21da9040d87 UnixLabels
        30a4cc8e5f4f902ea609c91caec48af7 Unix
        0ce699458ce4430954d7e6a78874647c Sys
…
        8988208489274193e4e3f69dc6ec2f75 MyModule1
        4164567363e873f17809de38a8c5f09e MyModule2
…
Used DLLs:
        dllcamlstr
        dllunix
Primitives used:
        re_string_match
        re_partial_match
…

1)我的理解是,program.byte嵌入了我的整个字节码.我想它嵌入了我使用的标准库模块的整个字节码,但是它呢?

我假设ocamlrun在运行时加载2个动态加载的库,通过这样做,它能够找到基元;它们是标准库所必需的.

我认为字节码可执行文件不能在没有ocamlrun的情况下运行,所以我不明白为什么OCaml会在我的程序中嵌入部分标准库,而不是用ocamlrun打包它们.

特别是因为字节码似乎在OCaml版本之间不兼容.我的意思是,无论如何,我无法用v4.01构建,然后用v4.02运行,反之亦然.

从技术的角度来看,我很好奇,但只要字节码可以在Unices中移植,我就可以忍受.但是,从法律角度来看,这让我担心嵌入LGPL许可的部分的字节码可执行文件的分发.这可能是为什么其他例外应用于OCaml库的原因.

2)我的问题的第二部分是,运行时ocamlrun的二进制依赖是什么?虽然字节码可移植性对于分发来说很有用,但是版本之间的不兼容性会使目的失败.在OCaml升级之后,您将如何设法仍然运行各种OCaml版本的字节码程序?

我以简单的方式尝试保留ocamlrun的副本,其版本与构建字节码可执行文件的ocamlc相同.然后在已安装较旧OCaml实现的计算机上使用此ocamlrun运行此可执行文件.正如预期的那样,失败了.

奖金问题)我没有Windows构建机器.我的程序执行Windows中不存在的系统调用;它是在Mac上构建的,但在Linux上工作正常.假设没有32位/ 64位问题,它是否可能在实践中运行在Cygwin上?

我无法通过谷歌搜索所有信息来找到信息,所以我甚至欣赏指向最新描述的指针.

干杯!

编辑:我试图找出是否可以避免源重新编译.使用案例:

>我提供了一个字节码可执行文件B.
>我可以告诉用户:“所以你不会在6个月/几年内使用OCaml版本的xyz吗?好吧,不要担心,通过保留xyz发行版中的二进制文件的副本,并遵循这些步骤,您仍然可以运行B而不会破坏其他所有内容.

我有B,但我对这些二进制文件和这些步骤一无所知.我尽可能地不去框架,并为用户保持简单.

我已经知道了OCaml Binary Compatibility issues with Windows,但是由于Cygwin在提供POSIX抽象层方面做得很好,我想知道是否有人成功运行了一个利用Unix,Sys等模块的POSIX特定系统功能的字节码可执行文件. (例如信号;否则对于Windows,仅模拟sigkill).我不是说MinGW等的交叉编译,而是动态链接Cygwin DLL – 就像使用Cygwin控制台一样.

最佳答案 1)是的,所使用模块的cmos与您的字节码程序链接.

是的,基元的C库是动态链接的.

对于任何相同版本的ocamlrun,字节码应该是可移植的:由于这个原因,OCaml的初始引导编译器引导/ ocamlc作为字节码分发.

您可以使用-custom选项显式链接ocamlrun和您的字节码,但是ocamlrun大约是半mb并且将它附加到每个字节码可执行文件是浪费.

我认为您对OCaml链接LGPL异常的猜测是正确的.

2)正如我所说,字节码可移植性仅适用于相同版本的运行时.如果我们升级OCaml版本,我们只需重新编译一切.在一些小的升级中,旧的字节码可以在新的ocamlrun中工作,因为升级中的字节码没有改变……但它只是靠运气而你永远不应该依赖它.顺便说一下,OPAM允许您拥有多个OCaml系统,如果您想保留较旧的字节码程序,可能需要使用它.

奖金问题)这取决于.例如,boot / ocamlc(OCaml的初始引导编译器)适用于所有系统.但是如果你的字节码依赖于OS特定的外部原语,那么它就无法在其他系统上运行.例如,Unix在Unix和Windows中有不同的C基元集,因此与Unix链接的字节码程序在Unix和Windows上都不能正常工作.

点赞