summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Vollmer <mvo@zagadka.de>1999-06-21 15:14:01 +0000
committerMarius Vollmer <mvo@zagadka.de>1999-06-21 15:14:01 +0000
commit56a19408b85067f3a0ed67a0e9b2eba5cac9ad54 (patch)
treeaf22d913902ee6a489d69949f12b875b095dd187
parent56ef2fe2300025d8fb92ddab4f832c2e68ed6ecf (diff)
downloadguile-56a19408b85067f3a0ed67a0e9b2eba5cac9ad54.tar.gz
* dynl.c (DYNL_GLOBAL): New.
(sysdep_dynl_link): Added `flags' argument. (kw_global, sym_global): New. (scm_dynamic_link): Handle keyword arguments. Pass suitable flags to sysdep_dynl_link. * dynl-dl.c (sysdep_dynl_link): Handle new `flags' argument by conditrionally adding RTLD_GLOBAL to DLOPEN_MODES. * dynl-shl.c (sysdep_dynl_link): Add and ignore new flags argument. * dynl-dld.c (sysdep_dynl_link): Add and ignore new flags argument. * dynl.h (scm_dynamic_link): Added rest argument. * dynl.c (sysdep_dynl_unlink, sysdep_dynl_func): Use const qualifier for char* argument, to match prototypes. Thanks to Mark Elbrecht.
-rw-r--r--NEWS13
-rw-r--r--libguile/dynl-dl.c6
-rw-r--r--libguile/dynl-dld.c3
-rw-r--r--libguile/dynl-shl.c3
-rw-r--r--libguile/dynl.h2
5 files changed, 22 insertions, 5 deletions
diff --git a/NEWS b/NEWS
index b4b848222..3f38d5e45 100644
--- a/NEWS
+++ b/NEWS
@@ -46,6 +46,19 @@ in backtraces.
* Changes to Scheme functions and syntax
+** The function `dynamic-link' now takes optional keyword arguments.
+ The only keyword argument that is currently defined is `:global
+ BOOL'. With it, you can control whether the shared library will be
+ linked in global mode or not. In global mode, the symbols from the
+ linked library can be used to resolve references from other
+ dynamically linked libraries. In non-global mode, the linked
+ library is essentially invisible and can only be accessed via
+ `dynamic-func', etc. The default is now to link in global mode.
+ Previously, the default has been non-global mode.
+
+ The `#:global' keyword is only effective on platforms that support
+ the dlopen family of functions.
+
** New function `provided?'
- Function: provided? FEATURE
diff --git a/libguile/dynl-dl.c b/libguile/dynl-dl.c
index 13401e23b..8522002d8 100644
--- a/libguile/dynl-dl.c
+++ b/libguile/dynl-dl.c
@@ -54,11 +54,13 @@
#endif
static void *
-sysdep_dynl_link (fname, subr)
+sysdep_dynl_link (fname, flags, subr)
const char *fname;
+ int flags;
const char *subr;
{
- void *handle = dlopen (fname, DLOPEN_MODE);
+ void *handle = dlopen (fname, (DLOPEN_MODE
+ | (flags & DYNL_GLOBAL)? RTLD_GLOBAL : 0));
if (NULL == handle)
{
SCM_ALLOW_INTS;
diff --git a/libguile/dynl-dld.c b/libguile/dynl-dld.c
index eef786ffd..f3c24c2b5 100644
--- a/libguile/dynl-dld.c
+++ b/libguile/dynl-dld.c
@@ -64,8 +64,9 @@ listundefs ()
}
static void *
-sysdep_dynl_link (fname, subr)
+sysdep_dynl_link (fname, int flags, subr)
const char *fname;
+ int flags;
const char *subr;
{
int status;
diff --git a/libguile/dynl-shl.c b/libguile/dynl-shl.c
index 385a8677c..8f0caf2d6 100644
--- a/libguile/dynl-shl.c
+++ b/libguile/dynl-shl.c
@@ -50,8 +50,9 @@
#include <string.h>
static void *
-sysdep_dynl_link (fname, subr)
+sysdep_dynl_link (fname, flags, subr)
const char *fname;
+ int flags;
const char *subr;
{
shl_t shl;
diff --git a/libguile/dynl.h b/libguile/dynl.h
index 3b0d37fcc..bca388e2c 100644
--- a/libguile/dynl.h
+++ b/libguile/dynl.h
@@ -51,7 +51,7 @@ void scm_register_module_xxx SCM_P ((char *module_name, void *init_func));
SCM scm_registered_modules SCM_P ((void));
SCM scm_clear_registered_modules SCM_P ((void));
-SCM scm_dynamic_link SCM_P ((SCM fname));
+SCM scm_dynamic_link SCM_P ((SCM fname, SCM rest));
SCM scm_dynamic_unlink SCM_P ((SCM dobj));
SCM scm_dynamic_object_p SCM_P ((SCM obj));
SCM scm_dynamic_func SCM_P ((SCM symb, SCM dobj));