[opam-devel] ocamlc.opt and pthreads
Mika Illouz
mika at illouz.net
Fri Jun 13 02:43:11 BST 2014
Dear OPAM-ers,
I have two systems on which opam is installed. System A runs Ubuntu
11.10 (ancient, I know) and opam 1.0.0, with the 4.00.1 ocaml compiler.
A $ lsb_release -i -c
Distributor ID: Ubuntu
Codename: natty
A $ opam --version
1.0.0
I have a second system, system B, running Ubuntu 13.10 (less ancient)
and opam 1.1.1, with the 3.12.1 and 4.01.0 compilers
B $ lsb_release -i -c
Distributor ID: Ubuntu
Codename: saucy
B $ opam --version
1.1.1
I will try to compile a simple ocaml program into bytecode, on both
systems, and for the heck of it, link against system threads library:
A $ echo "let _ = print_endline \"hi\"" > /tmp/x.ml
A $ /home/mika/.opam/4.00.1/bin/ocamlc -thread
/home/mika/.opam/4.00.1/lib/ocaml/threads/threads.cma /tmp/x.ml -o /tmp/x
A $ /home/mika/.opam/4.00.1/bin/ocamlc.opt -thread
/home/mika/.opam/4.00.1/lib/ocaml/threads/threads.cma /tmp/x.ml -o /tmp/x
No problem so far.
Now on system B:
B $ echo "let _ = print_endline \"hi\"" > /tmp/x.ml
B $ /home/mika/.opam/3.12.1/bin/ocamlc -thread
/home/mika/.opam/3.12.1/lib/ocaml/threads/threads.cma /tmp/x.ml -o /tmp/x
B $ /home/mika/.opam/3.12.1/bin/ocamlc.opt -thread
/home/mika/.opam/3.12.1/lib/ocaml/threads/threads.cma /tmp/x.ml -o /tmp/x
File "/tmp/x.ml", line 1, characters 0-1:
Error: Error on dynamically loaded library:
/home/mika/.opam/3.12.1/lib/ocaml/stublibs/dllthreads.so:
/home/mika/.opam/3.12.1/lib/ocaml/stublibs/dllthreads.so: undefined symbol:
pthread_sigmask
On system B, ocamlc.opt seems to have trouble, whereas ocamlc does
not. (4.01.0 also has the identical issue). Trying to figure out
why, I looked at the DLL dependencies of the ocamlc.opt's :
A $ ldd /home/mika/.opam/4.00.1/bin/ocamlc.opt
linux-vdso.so.1 => (0x00007fffa29ff000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fad8291b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fad82717000)
libncurses.so.5 => /lib/libncurses.so.5 (0x00007fad824d2000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0
(0x00007fad822b4000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fad81f1c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fad82bc7000)
B $ ldd /home/mika/.opam/3.12.1/bin/ocamlc.opt
linux-vdso.so.1 => (0x00007fff8affe000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f128410c000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1283f08000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1283b3f000)
/lib64/ld-linux-x86-64.so.2 (0x00007f128441c000)
The critical difference seems to be that system A's ocamlc.opt is linked
against libpthread.so (and libncurses.so, for whatever reason), and
system B's does not. In fact, compilation succeeds on system B if I
use LD_PRELOAD:
B $ LD_PRELOAD=/lib/x86_64-linux-gnu/libpthread.so.0
/home/mika/.opam/3.12.1/bin/ocamlc -thread
/home/mika/.opam/3.12.1/lib/ocaml/threads/threads.cma /tmp/x.ml -o /tmp/x
Incidentally, if I compile ocaml from Inria's tarball, compilation
using ocamlc.opt also fails on system B, unless I configure the the
compilation of the compiler with "./configure -libs -lpthread" .
The ocaml installed through opam on system A seems to do the right
thing. Does anyone have any idea how I can make system B's compiler
behave similarly?
thanks
mika
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ocaml.org/pipermail/opam-devel/attachments/20140612/d454ac6f/attachment.html>
More information about the opam-devel
mailing list