caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Georg Martius <georg.martius@web.de>
To: caml-list@inria.fr
Subject: [Caml-list] Segmentationfault on 64bit when called from C
Date: Tue, 31 Jul 2012 14:17:45 +0200	[thread overview]
Message-ID: <4350198.FKG0AFFZGv@arges> (raw)

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


             reply	other threads:[~2012-07-31 12:17 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-31 12:17 Georg Martius [this message]
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

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=4350198.FKG0AFFZGv@arges \
    --to=georg.martius@web.de \
    --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;
as well as URLs for NNTP newsgroup(s).