From: Romain Bardou <bardou@lri.fr>
To: caml-list@inria.fr
Subject: [Caml-list] Link a .so/.dll dynamically
Date: Wed, 14 Sep 2011 17:00:31 +0200 [thread overview]
Message-ID: <4E70C18F.3040304@lri.fr> (raw)
Hello Caml-List,
I need to write a program which handles several devices. Each device has
a .so (linux) or .dll (windows) driver. Each of these DLL share the same
API, defined in C headers (api.h).
Here is what I figured I should do.
- Write a binding for the library.
* OCaml part: mylib.ml, with externals.
* C part: wrapper.c, implementing the externals.
- Which itself includes api.h and may use the functions of the API.
- Dynamically load this library using Dynlink.
Later, the Mylib module will register each function of the API so the
program can call them, but that's not the issue (although if there is a
simpler way please tell).
So far, here is what I have achieved: I managed to dynamically load a
Mylib module with externals in wrapper.c, but this wrapper.c file does
not include nor use the API (it just prints some text on standard
output). Here is how I compile the program:
ocamlc -c wrapper.c
ocamlc -c mylib.ml
ocamlmklib wrapper.o mylib.cmo -o mylib
ocamlc -c main.ml
ocamlc dynlink.cma main.cmo -o main
CAML_LD_LIBRARY_PATH=. ./main
The main.ml file uses Dynlink to load "mylib.cma". The
CAML_LD_LIBRARY_PATH environment variable is needed for some reason, or
the dynamic linker cannot find dllmylib.so.
My first problem is: I tried something similar for native code (using
ocamlopt instead of ocamlc, .cmx instead of .cmo and .cmxa instead of
.cma) but ocamlmklib fails with the following error:
/usr/bin/ld: wrapper.o: relocation R_X86_64_32 against `.rodata' can
not be used when making a shared object; recompile with -fPIC
wrapper.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
I have absolutely no idea what this means, I'm really confused here and
Google does not help.
My second, more important problem is: how do I link with the .so / .dll
of my device? Obviously, once I use functions declared in api.h, the .so
needs to be loaded or I get the "undefined symbol" error. Assume I want
to link with /usr/lib/toto.so. How should I modify my compilation
process to ensure that this driver will be dynamically loaded when Mylib
is dynamically linked with Dynlink? I tried various combinations of
parameters for ocamlmklib and none worked.
A third question will be: I'm testing this under Linux with .so files,
will there be additional problems on Windows with .dll files?
Thank you for your help. As you can see, I'm a little confused about
those things.
--
Romain Bardou
next reply other threads:[~2011-09-14 15:01 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-14 15:00 Romain Bardou [this message]
2011-09-14 15:35 ` Benedikt Meurer
[not found] ` <83695D27-A767-438A-B909-6864D1A655FE@googlemail.com>
2011-09-14 15:56 ` Romain Bardou
2011-09-14 15:59 ` Benedikt Meurer
2011-09-14 16:03 ` Romain Bardou
2011-09-14 16:07 ` Jérémie Dimino
2011-09-14 16:07 ` Stéphane Glondu
2011-09-14 16:12 ` Romain Bardou
2011-09-14 16:34 ` Stéphane Glondu
2011-09-14 16:42 ` Romain Bardou
2011-09-14 16:56 ` Stéphane Glondu
2011-09-15 8:49 ` Romain Bardou
2011-09-15 9:20 ` Stéphane Glondu
2011-09-15 9:23 ` Romain Bardou
2011-09-15 9:05 ` Romain Bardou
2011-09-14 16:15 ` Jérémie Dimino
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=4E70C18F.3040304@lri.fr \
--to=bardou@lri.fr \
--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