Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
[Caml-list] OCaml-3.08.1/MinGW: alloc_tuple fails
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Xavier Leroy <Xavier.Leroy@i...>
Subject: Re: [Caml-list] OCaml-3.08.1/MinGW: alloc_tuple fails
> A program (from the OCam'Ole package) segfaults in a alloc_tuple call.
> This behavior is shown only with native compilation.

There have been many theories on what could be wrong in the C
function you showed.  However, I believe the problem comes from the
way you link it with the native code produced by ocamlopt:

> gcc -mno-cygwin -c -shared -O  -mms-bitfields -DCAML_DLL -DDLL=1 -I
> c:/ocamlmgw/lib test.cpp -D_DEBUG -g
> gcc -shared -mno-cygwin -mms-bitfields -I C:/ocamlmgw/lib -o dlltest.dll
> -Wl,--out-implib,libtest.a test.o c:/ocamlmgw/lib/ocamlrun.a

By linking with the import library ocamlrun.a, you bind your C code to
the bytecode Caml runtime system.  Any program that links with
dlltest.dll will cause ocamlrun.dll to be loaded, and your test.c code
will use the alloc_tuple() function from ocamlrun.dll.

This is fine if you later use dlltest.dll with an ocamlc-compiled
program, since the latter also uses ocamlrun.dll as its runtime

This is wrong if you use dlltest.dll with an ocamlopt-compiled
program, as in

    ocamlopt -ccopt dlltest.dll -ccopt -g -o test_it.exe

since the latter is statically linked with a different runtime system
(libasmrun.a, the native-code runtime system).  You get two different
runtime systems that don't "speak" to each other.

So, there is no way you can use the same DLL with both bytecode and

You should however be able to compile your test.c code to a static
library (libtest.a).  This static lib is not pre-bound to a particular
version of the runtime system.  So,

   ocamlc -custom .... libtest.a

will link everything with the bytecode runtime system, and

   ocamlopt ... libtest.a

will link everything with the native-code runtime system.

More generally speaking, given the way Windows DLLs work, I don't
think it is possible at all to put Caml-C stub code in a DLL and pass
that DLL to ocamlopt.  Static linking is your friend here.

- Xavier Leroy

To unsubscribe, mail Archives:
Bug reports: FAQ:
Beginner's list: