Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Gabriel Scherer <gabriel.scherer@gmail.com>
To: Alan Schmitt <alan.schmitt@polytechnique.org>
Cc: caml-list list <caml-list@inria.fr>
Subject: Re: [Caml-list] state of native dynlink on os x
Date: Thu, 8 Mar 2012 17:16:30 +0100	[thread overview]
Message-ID: <CAPFanBEggz8CUs04CO7RjYsGYOxqbeoN4XytNDrNYoY4QrBhCA@mail.gmail.com> (raw)
In-Reply-To: <D58E8E4D-A8A5-468C-B796-9F4C1FAB0735@polytechnique.org>

This error is not Mac-related (I can reproduce it on my Debian).
I believe it is a result from the "link-by-need" semantics of the .cma
and .cmxa: loader.ml does not explicitly depend on test, so when
producing the executable test.cmxa isn't linked (modules included
.cm{x,}a, contrarily to .cm{x,o}, are only linked when they are a
runtime dependency of one of the other modules).

I can remove the error by either:
- compiling to "test.cmx" instead of "test.cmxa"
- or adding a dummy dependency in loader.ml:
    let () = ignore (Test.f)

I am not familiar with the building of dynlink plugins (no idea what
"-shared" does and whether you are expecting the compiled code for
Test to end up linked inside "plugin.cmxs" instead of linked at
executable compile time), so there may be another solution for this.
But I remember other people mentioning this "explicit dependency"
thing in the past; the dummy dependency is probably the right thing to
do if you consider Test a library that come with the loader
application and should be usable by all dynlinked module. If it is
morally local to "plugin", there must be another approach.

On Thu, Mar 8, 2012 at 3:16 PM, Alan Schmitt
<alan.schmitt@polytechnique.org> wrote:
> On 8 mars 2012, at 12:13, Alan Schmitt wrote:
>
>> On 27 févr. 2012, at 16:43, Damien Doligez wrote:
>>
>>>> Also, when running why3, I get some undefined symbols (_camlRandom, _camlParsing, _camlString). Where are these symbols defined?
>>>
>>> Looks like modules of the standard library, right ?
>>
>> Regarding this, should something special be done when dynlinking a file that depends on the standard library? I assume that dependencies are not automatically loaded, but should one load the standard library first?
>>
>> In other words, is this a bug in why3, or in ocaml?
>
> Trying to get to the bottom of this, here is what I've done.
>
> - Adapting the minimal example from http://caml.inria.fr/mantis/view.php?id=5093 I checked that I can load a plugin that uses a function from Random.
> - I then tried to load a why3 plugin. It fails because it cannot find some symbol (_camlWhy3), and I could not find how to compile things to make sure why3.cmxa is linked with the plugin.
> - Getting back to the basics, I tried to create a small archive of my own, which I would use in a plugin, and this is where I'm stuck. I have the following files:
>
> test.ml:
>
> let f () = "foo"
>
> plugin.ml:
>
> let s = Test.f ()
> let () = print_endline s
>
> loader.ml:
>
> let load f =
>  try
>    Dynlink.loadfile f
>  with Dynlink.Error e -> print_endline (Dynlink.error_message e)
>
> let () = load "plugin.cmxs"
>
> to build everything, I do (I tried adding test.cmxa everywhere, to no avail. Everything lives in the same, current directory):
>
> ocamlopt.opt -a -o test.cmxa test.ml
> ocamlopt.opt -c -linkall -o plugin.cmx test.cmxa plugin.ml
> ocamlopt.opt -shared plugin.cmx test.cmxa -o plugin.cmxs
> ocamlopt.opt test.cmxa dynlink.cmxa loader.ml -o loader.native
>
> When I run "./loader.native", I get:
>
> no implementation available for Test
>
> I googled this error and could only find references to problem related to the (deprecated) Dynlink.add_interfaces, which is not even supposed to work natively.
>
> What am I doing wrong?
>
> Thanks,
>
> Alan
>
>
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa-roc.inria.fr/wws/info/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>


  parent reply	other threads:[~2012-03-08 16:17 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-15 11:17 Alan Schmitt
2012-02-15 12:34 ` Daniel Bünzli
2012-02-15 14:16   ` Alan Schmitt
2012-02-17  6:47 ` Alan Schmitt
2012-02-27 15:43   ` Damien Doligez
2012-02-27 17:49     ` Pierre-Alexandre Voye
2012-02-28 10:15       ` David MENTRE
2012-02-28 10:32         ` Pierre-Alexandre Voye
2012-02-28 15:34     ` Alan Schmitt
2012-02-29  8:33       ` Alan Schmitt
2012-03-07 10:55       ` Damien Doligez
2012-03-07 15:14         ` Alan Schmitt
2012-03-08 11:13     ` Alan Schmitt
2012-03-08 14:16       ` Alan Schmitt
2012-03-08 14:23         ` Pierre-Alexandre Voye
2012-03-08 14:35           ` Alan Schmitt
2012-03-08 15:50             ` Pierre-Alexandre Voye
2012-03-08 16:19               ` Jérémie Dimino
2012-03-08 16:16         ` Gabriel Scherer [this message]
2012-03-08 16:25           ` Jérémie Dimino
2012-03-08 16:31             ` Alan Schmitt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAPFanBEggz8CUs04CO7RjYsGYOxqbeoN4XytNDrNYoY4QrBhCA@mail.gmail.com \
    --to=gabriel.scherer@gmail.com \
    --cc=alan.schmitt@polytechnique.org \
    --cc=caml-list@inria.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox