summaryrefslogtreecommitdiffstats
path: root/unix
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2011-03-22 10:14:00 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2011-03-22 10:14:00 (GMT)
commit30a811ccfbefb88b6677db80c9bf952e3c63f0d0 (patch)
treebd799accde5a0badd4053c8b583bc496ce792682 /unix
parenta5177ffb5dd447e70609635c7472f0eeb7f88fde (diff)
parentb9f74bb43e5903dbe3fadd8c4d382c1724ee883f (diff)
downloadtcl-30a811ccfbefb88b6677db80c9bf952e3c63f0d0.zip
tcl-30a811ccfbefb88b6677db80c9bf952e3c63f0d0.tar.gz
tcl-30a811ccfbefb88b6677db80c9bf952e3c63f0d0.tar.bz2
[Bug #3216070] Loading extension libraries from embedded Tcl applications.
Diffstat (limited to 'unix')
-rw-r--r--unix/tclLoadDl.c20
-rw-r--r--unix/tclLoadDyld.c10
2 files changed, 21 insertions, 9 deletions
diff --git a/unix/tclLoadDl.c b/unix/tclLoadDl.c
index aeb06ef..96f0717 100644
--- a/unix/tclLoadDl.c
+++ b/unix/tclLoadDl.c
@@ -19,17 +19,17 @@
/*
* In some systems, like SunOS 4.1.3, the RTLD_NOW flag isn't defined and this
- * argument to dlopen must always be 1. The RTLD_GLOBAL flag is needed on some
- * systems (e.g. SCO and UnixWare) but doesn't exist on others; if it doesn't
- * exist, set it to 0 so it has no effect.
+ * argument to dlopen must always be 1. The RTLD_LOCAL flag doesn't exist on
+ * some platforms; if it doesn't exist, set it to 0 so it has no effect.
+ * See [Bug #3216070]
*/
#ifndef RTLD_NOW
# define RTLD_NOW 1
#endif
-#ifndef RTLD_GLOBAL
-# define RTLD_GLOBAL 0
+#ifndef RTLD_LOCAL
+# define RTLD_LOCAL 0
#endif
/*
@@ -82,7 +82,10 @@ TclpDlopen(
*/
native = Tcl_FSGetNativePath(pathPtr);
- handle = dlopen(native, RTLD_NOW | RTLD_GLOBAL);
+ /*
+ * Use (RTLD_NOW|RTLD_LOCAL) always, see [Bug #3216070]
+ */
+ handle = dlopen(native, RTLD_NOW | RTLD_LOCAL);
if (handle == NULL) {
/*
* Let the OS loader examine the binary search path for whatever
@@ -94,7 +97,10 @@ TclpDlopen(
const char *fileName = Tcl_GetString(pathPtr);
native = Tcl_UtfToExternalDString(NULL, fileName, -1, &ds);
- handle = dlopen(native, RTLD_NOW | RTLD_GLOBAL);
+ /*
+ * Use (RTLD_NOW|RTLD_LOCAL) always, see [Bug #3216070]
+ */
+ handle = dlopen(native, RTLD_NOW | RTLD_LOCAL);
Tcl_DStringFree(&ds);
}
diff --git a/unix/tclLoadDyld.c b/unix/tclLoadDyld.c
index 4fa1954..3fba3a5 100644
--- a/unix/tclLoadDyld.c
+++ b/unix/tclLoadDyld.c
@@ -207,7 +207,10 @@ TclpDlopen(
if (tclMacOSXDarwinRelease >= 8)
#endif
{
- dlHandle = dlopen(nativePath, RTLD_NOW | RTLD_GLOBAL);
+ /*
+ * Use (RTLD_NOW|RTLD_LOCAL) always, see [Bug #3216070]
+ */
+ dlHandle = dlopen(nativePath, RTLD_NOW | RTLD_LOCAL);
if (!dlHandle) {
/*
* Let the OS loader examine the binary search path for whatever
@@ -217,7 +220,10 @@ TclpDlopen(
fileName = Tcl_GetString(pathPtr);
nativeFileName = Tcl_UtfToExternalDString(NULL, fileName, -1, &ds);
- dlHandle = dlopen(nativeFileName, RTLD_NOW | RTLD_GLOBAL);
+ /*
+ * Use (RTLD_NOW|RTLD_LOCAL) always, see [Bug #3216070]
+ */
+ dlHandle = dlopen(nativeFileName, RTLD_NOW | RTLD_LOCAL);
}
if (dlHandle) {
TclLoadDbgMsg("dlopen() successful");