caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
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
> 


      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).