This is the mail archive of the guile@cygnus.com mailing list for the guile project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Dynamic linking support



Hi,

Has anyone had dynamic linking support working for guile in a recent
snapshot?  I have a snapshot from June 15th, and an apparently correct
input is failing in mysterious ways.  I'm running linux 2.0.0...

After much confusion, the problem appears to be somewhere in the
libguile C code.  My init_module function is being called, and it
calls scm_register_module_xxx, but when c-registered-modules is
called, it returns no modules. 

I believe this also happened with a snapshot from about a month ago,
but not with one from about a year ago...

Andrew

Here's my input:
cat learn2.c << EOF

#include <math.h>
#include <guile/gh.h>
#include <libguile.h>

/* @r{this is a factorial routine in C, made to be callable by Scheme} */
SCM c_factorial(SCM s_n)
{
  int i;
  unsigned long result = 1, n;

  n = gh_scm2ulong(s_n);

  gh_defer_ints();
  for (i = 1; i <= n; ++i) {
    result = result*i;
  }
  gh_allow_ints();
  return gh_ulong2scm(result);
}

/* @r{a sin routine in C, callable from Scheme.  it is named c_sin() to
   distinguish it from the default Scheme sin function} */
SCM c_sin(SCM s_x)
{
  double x = gh_scm2double(s_x);

  return gh_double2scm(sin(x));
}

/* @r{play around with vectors in Guile: this routine creates a vector of
   the given length, initializes it all to zero except element 2 which
   is set to 1.9.}  */
SCM vector_test(SCM s_length)
{
  SCM xvec;

  printf("requested length for vector: %ld\n", gh_scm2ulong(s_length));

  /* create a vector */
  xvec = gh_make_vector(s_length, gh_double2scm(0.0));
  /* set the second element in it */
  gh_vector_set_x(xvec, gh_int2scm(2), gh_double2scm(1.9));

  return xvec;
}

/* @r{now try to define some new builtins, coded in C, so that they are
      available in Scheme.} */
void 
init_learn2() 
{
  printf("initializing module\n"); fflush(stdout);
  gh_new_procedure1_0("c-factorial", c_factorial);
  gh_new_procedure1_0("c-sin", c_sin);
  gh_new_procedure1_0("v-t", vector_test);
}

/* @r{This function has a magic name so guile knows to call it upon
      loading this module.} */
void
scm_init_tut_learn2_module ()
{
  printf("registering module\n"); fflush(stdout);
  scm_register_module_xxx ("tut learn2", init_learn2);
}
EOF
cat test.scm <<EOF
(debug-enable 'backtrace)
(assert-repl-verbosity #t)

(display "Beginning traces...\n")

(trace resolve-module try-module-dynamic-link)
(trace find-and-link-dynamic-module init-dynamic-module)
(trace try-using-libtool-name try-using-sharlib-name)
(trace link-dynamic-module dynamic-call save-module-excursion)
;(trace set-module-public-interface! set-current-module)
(trace convert-c-registered-modules split-c-module-name)
(trace c-registered-modules c-clear-registered-modules)

(display registered-modules)
(use-modules (tut learn2))
(display registered-modules)

EOF
gcc -fPIC -c learn2.c
gcc -o liblearn2.so -shared learn2.o -lguile -lqthreads -lm
mkdir tut
cp liblearn2.so tut
guile <test.scm
guile> (stack 20000 debug backtrace depth 20 maxdepth 1000 frames 3 indent 10 procnames cheap)
guile> ;;; 420  msec  (390 msec in gc)
guile> Beginning traces...
;;; 10  msec  (0 msec in gc)
guile> (resolve-module try-module-dynamic-link)
;;; 250  msec  (0 msec in gc)
guile> (find-and-link-dynamic-module init-dynamic-module)
;;; 150  msec  (0 msec in gc)
guile> (try-using-libtool-name try-using-sharlib-name)
;;; 140  msec  (0 msec in gc)
guile> (link-dynamic-module dynamic-call save-module-excursion)
;;; 190  msec  (0 msec in gc)
guile> (convert-c-registered-modules split-c-module-name)
;;; 160  msec  (380 msec in gc)
guile> (c-registered-modules c-clear-registered-modules)
;;; 170  msec  (0 msec in gc)
guile> ();;; 40  msec  (0 msec in gc)
guile> [resolve-module (tut learn2)]
|  [init-dynamic-module (tut learn2)]
|  #f
|  [resolve-module (tut) #f]
|  #<directory tut 40166d00>
|  [try-module-dynamic-link (tut learn2)]
|  |  [find-and-link-dynamic-module (tut learn2)]
|  |  |  [try-using-libtool-name "/usr/local/share/guile/site/tut/" "liblearn2"]
|  |  |  |  [resolve-module (ice-9 regex)]
|  |  |  |  #<directory regex 401571f0>
|  |  |  #f
|  |  |  [try-using-sharlib-name "/usr/local/share/guile/site/tut/" "liblearn2"]
|  |  |  "/usr/local/share/guile/site/tut/liblearn2.so"
|  |  |  [try-using-libtool-name "/usr/local/share/guile/1.3a/tut/" "liblearn2"]
|  |  |  |  [resolve-module (ice-9 regex)]
|  |  |  |  #<directory regex 401571f0>
|  |  |  #f
|  |  |  [try-using-sharlib-name "/usr/local/share/guile/1.3a/tut/" "liblearn2"]
|  |  |  "/usr/local/share/guile/1.3a/tut/liblearn2.so"
|  |  |  [try-using-libtool-name "/usr/local/share/guile/tut/" "liblearn2"]
|  |  |  |  [resolve-module (ice-9 regex)]
|  |  |  |  #<directory regex 401571f0>
|  |  |  #f
|  |  |  [try-using-sharlib-name "/usr/local/share/guile/tut/" "liblearn2"]
|  |  |  "/usr/local/share/guile/tut/liblearn2.so"
|  |  |  [try-using-libtool-name "./tut/" "liblearn2"]
|  |  |  |  [resolve-module (ice-9 regex)]
|  |  |  |  #<directory regex 401571f0>
|  |  |  #f
|  |  |  [try-using-sharlib-name "./tut/" "liblearn2"]
|  |  |  "./tut/liblearn2.so"
|  |  [link-dynamic-module "./tut/liblearn2.so" "scm_init_tut_learn2_module"]
|  |  |  [dynamic-call "scm_init_tut_learn2_module" #<dynamic-object "./tut/liblearn2.so">]
registering module
|  |  |  #<unspecified>
|  |  |  [convert-c-registered-modules #<dynamic-object "./tut/liblearn2.so">]
|  |  |  |  [c-registered-modules]
|  |  |  |  ()
|  |  |  |  [c-clear-registered-modules]
|  |  |  |  #<unspecified>
|  |  |  ()
|  |  #<unspecified>
|  [init-dynamic-module (tut learn2)]
|  #f
#<directory learn2 40145850>

Backtrace:
0* (use-modules (tut learn2))
1  [process-use-modules ((tut learn2))]
2  [for-each #<procedure (module-name)> ((tut learn2))]
3* [#<procedure (module-name)> (tut learn2)]
4* (let ((mod-iface #)) (or mod-iface (error "no such module" module-name)) ...)
5* (or mod-iface (error "no such module" module-name))
6  [error "no such module" (tut learn2)]

ERROR: In procedure error in expression (error "no such module" module-name):
ERROR: no such module (tut learn2)
ABORT: (misc-error)
guile> ();;; 70  msec  (0 msec in gc)
guile> 
;;; EOF -- quitting
;;; QUIT executed, repl exitting
;;; 470  msec  (0 msec in gc)