2015-05-06 62 views
4

二進制我的意思是字節碼和本地代碼。二進制文件如何嵌入並在字節碼可執行文件和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上運行?

我無法通過使用Google搜索來查找信息,所以我甚至可以欣賞指向最新描述的指針。

乾杯!

編輯:我試圖找出是否可以避免源代碼重新編譯。使用案例:

  • 我提供了一個字節碼可執行B
  • 我可以告訴用戶:「所以你不會在六個月內使用OCaml的版本XYZ了/一兩年好了,不用擔心,從XYZ分佈保持的those binaries副本,並按照these steps,你仍然可以運行B沒有打破一切。

我有B,但我不知道those binariesthese steps什麼。儘可能多儘可能我寧願不要去框架,並保持簡單的用戶。

我已經知道了OCaml Binary Compatibility issues with Windows,但是由於Cygwin在提供POSIX抽象層方面做得非常好,我不知道是否有人成功運行了利用Unix的POSIX特定系統特性的字節碼可執行文件, Sys等模塊(,例如信號;否則對於Windows,只能仿真sigkill)。我沒有談及MinGW等的交叉編譯,而是與Cygwin DLL動態鏈接 - 就像使用Cygwin控制檯一樣。

回答

2

1)是的,cmo已使用的模塊與您的字節碼程序鏈接。

是的,基元的C庫是動態鏈接的。

Bytecode對於任何相同版本的ocamlrun都應該是可移植的:由於這一點,OCaml的初始引導編譯器boot/ocamlc以字節碼形式分發。

您可以用-custom選項明確鏈接ocamlrun與您的字節碼,但ocamlrun大約爲半mb,並將其附加到每個字節碼可執行文件是浪費。

我想你對OCaml的LGPL鏈接例外的猜測是正確的。

2)正如我所說的,字節碼可移植性僅在相同版本的運行時才能得到保證。如果我們升級OCaml版本,我們只需重新編譯一切。在一些小的升級中,舊的字節碼可能在新的ocamlrun中工作,因爲字節碼在升級中沒有改變......但是這只是運氣,你不應該依賴它。順便說一句,OPAM允許你擁有多個OCaml系統,如果你想保留舊的字節碼程序,你可能想使用它。

獎金問題)這取決於。例如,boot/ocamlc是OCaml的初始引導編譯器,適用於所有系統。但是如果你的字節碼依賴於操作系統特定的外部原語,它就不會在其他系統上工作。例如,Unix在Unix和Windows中具有不同的C原語集,因此與Unix鏈接的字節碼程序在Unix和Windows上都不能正常工作。

+0

感謝您確認我的擔憂:p我編輯了我的問題。我不知道在添加'-lflag -custom'後字節碼可執行文件是否仍然可以移植,但在我的最後還是缺少了一些東西:程序不能在其他地方運行。 – eruve

相關問題