Open yasuo-ozu opened 1 year ago
Hi @yasuo-ozu. Why do the two wrappers link in the OCaml runtime? Isn't a better way of going around this issue to have a single OCaml runtime? So a_rs
and b_rs
will contain the OCaml code they wrap, but the OCaml runtime will only be included by c
(the program using a_rs
and b_rs
)
@tizoc Thanks for reply. I'm assuming that authors of a_rs
and b_rs
are different, and author of c
doesn't aware that they wraps an OCaml runtime.
Additionaally, I am thinking of building an discrete runtime with ocamlc --make-runtime
command and bundling with discrete Rust crate like caml_runtime_sys
on which a_rs
and b_rs
depends, but it also problematic, becausr there are no warranty that OCaml nativa code of a_rs
and b_rs
are built with same OCaml toolchain.
(Sorry in advance if I misunderstood..)
Problem
When using Rust as host language and loading multiple OCaml custom binaries, conflicts occure in symbol names of OCaml's runtime.
Example setting
Using two wrapper crates
a_rs
andb_rs
, which are wrapper crates of OCaml's librarya
andb
. Link error occurs when trying to build a crate, which depends on botha_rs
andb_rs
.Solution
The essential cause is we cannot support multiple OCaml runtimes in same Rust binary with current native (static or dynamic) loading mechanism. Using
dlopen2
will solve it because it supports FFI of both native loading ordlopen
mechanism. (I recommenddlopen
strongly for Rust users who will create library crates (not binary crate)).