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