From: Anil Madhavapeddy <anil@recoil.org>
To: Georg Martius <georg.martius@web.de>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Segmentationfault on 64bit when called from C
Date: Tue, 31 Jul 2012 14:11:06 +0100 [thread overview]
Message-ID: <3E83E531-7394-43A0-A070-0FCE4DD11696@recoil.org> (raw)
In-Reply-To: <4350198.FKG0AFFZGv@arges>
Interesting; I'm seeing a similar issue that could be to do with the frametable
not being initialised soon enough on OSX Mountain Lion. It only manifests when
recording backtraces in native mode, but I haven't quite had the time to chase
it down fully yet. However, the below bug report does show where you can init
the frametable earlier to work around the bug.
http://caml.inria.fr/mantis/view.php?id=5700
-anil
On 31 Jul 2012, at 13:17, Georg Martius <georg.martius@web.de> wrote:
> Dear all,
>
> I experienced a very intricate bug in the 64bit runtime that took me some days
> to nail down. I submitted a bug report #5707.
> Here is what I found: When ocaml code is compiled as as a libary and called
> from C++ under 64bit I get a broken stack for functions with more than 8
> parameters. I compiled ocaml 3.12.1 version with -fPIC. BTW: everthing works
> fine on 32bit.
>
> The problem occurs when a function with more than 8 parameters is called. The
> last parameters do have the right value. If afterwards a reference is accessed
> then a segmentation fault occurs, see the code below.
>
> Here the code: (in the bug report I also attached a tar file)
> ---- m1.ml ------------------
> module M2 = struct
> let v = ref 0;;
>
> let foo p1 p2 p3 p4 p5 p6 p7 p8 p9 =
> prerr_endline "start";
> print_endline (string_of_int p1);
> print_endline (string_of_int p2);
> print_endline (string_of_int p3);
> print_endline (string_of_int p4);
> print_endline (string_of_int p5);
> print_endline (string_of_int p6);
> print_endline (string_of_int p7);
> print_endline (string_of_int p8);
> print_endline (string_of_int p9);
> print_endline (string_of_int !v);
> prerr_endline "end";
> ;;
> end;;
>
>
> let test i : unit =
> print_endline ("Initialising: " ^ (string_of_int i));
> M2.foo 1 2 3 4 5 6 7 8 9;
> ;;
>
> (* test 10;;*)
>
> let _ = Callback.register "test" test;;
> ----- end m1.ml
>
> ----- interface.c
> #include <caml/mlvalues.h>
> #include <caml/callback.h>
>
> #include "interface.h"
>
> void ocaml_initialize(char** argv){
> caml_main(argv);
> }
>
> void ocaml_test(){
> value* test_pointer = caml_named_value("test");
> caml_callback(*test_pointer, Val_int(11));
> }
> ------ end interface.c
>
> ----- interface.h
> void ocaml_initialize(char** argv);
>
> void ocaml_test();
> ----- end interface.h
>
> You need ocaml to be compiled with -fPIC on order to be able to generate a
> shared libary on 64bit, as written in the INSTALL
> ./configure -cc "gcc -fPIC" -aspp "gcc -c -fPIC"
>
> ocamlopt -o libmytest.so -ccopt -shared interface.c m1.ml
> g++ -Wall main.cpp -lmytest -o test
> ./test
> ---- output:
> Initialising: 11
> start
> 1
> 2
> 3
> 4
> 5
> 6
> 7
> 8
> 70367718054944
> Segmentation fault (core dumped)
> --- end outpuyt
>
> Some Observations:
> Calling it natively as an ocaml executable works.
> Commenting the access to !v removes the segmentation fault but still the
> values are wrong.
> Uncommenting line "test 10", causes the error already at this call and the
> subsequent call from C runs fine!
>
> Best regards,
> Georg
>
>
> --
> 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
>
prev parent reply other threads:[~2012-07-31 13:11 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-31 12:17 Georg Martius
2012-07-31 12:59 ` Gerd Stolpmann
2012-07-31 14:03 ` Georg Martius
2012-07-31 14:29 ` Xavier Leroy
2012-07-31 13:11 ` Anil Madhavapeddy [this message]
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=3E83E531-7394-43A0-A070-0FCE4DD11696@recoil.org \
--to=anil@recoil.org \
--cc=caml-list@inria.fr \
--cc=georg.martius@web.de \
/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;
as well as URLs for NNTP newsgroup(s).