]> granicus.if.org Git - python/commitdiff
Fix #1467450: ctypes now uses RTLD_GLOBAL by default on OSX 10.3 to
authorThomas Heller <theller@ctypes.org>
Wed, 12 Jul 2006 08:43:47 +0000 (08:43 +0000)
committerThomas Heller <theller@ctypes.org>
Wed, 12 Jul 2006 08:43:47 +0000 (08:43 +0000)
load shared libraries.

Lib/ctypes/__init__.py
Misc/NEWS

index 4987a7948057661c56c7bd0e5e96dffaa43e0f5e..b7d173375b9f501eb24a07c4ad1d11a9719dc5b8 100644 (file)
@@ -22,6 +22,23 @@ if __version__ != _ctypes_version:
 if _os.name in ("nt", "ce"):
     from _ctypes import FormatError
 
+DEFAULT_MODE = RTLD_LOCAL
+if _os.name == "posix" and _sys.platform == "darwin":
+    import gestalt
+
+    # gestalt.gestalt("sysv") returns the version number of the
+    # currently active system file as BCD.
+    # On OS X 10.4.6 -> 0x1046
+    # On OS X 10.2.8 -> 0x1028
+    # See also http://www.rgaros.nl/gestalt/
+    #
+    # On OS X 10.3, we use RTLD_GLOBAL as default mode
+    # because RTLD_LOCAL does not work at least on some
+    # libraries.
+
+    if gestalt.gestalt("sysv") < 0x1040:
+        DEFAULT_MODE = RTLD_GLOBAL
+
 from _ctypes import FUNCFLAG_CDECL as _FUNCFLAG_CDECL, \
      FUNCFLAG_PYTHONAPI as _FUNCFLAG_PYTHONAPI
 
@@ -284,7 +301,7 @@ class CDLL(object):
         _flags_ = _FUNCFLAG_CDECL
         _restype_ = c_int # default, can be overridden in instances
 
-    def __init__(self, name, mode=RTLD_LOCAL, handle=None):
+    def __init__(self, name, mode=DEFAULT_MODE, handle=None):
         self._name = name
         if handle is None:
             self._handle = _dlopen(self._name, mode)
index 114664f12bb0c8399d3b099b3e1ad0387ee1b602..a9ef3ee801d8950845602c4fea8503f0a94f9e02 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -22,6 +22,8 @@ Library
 Extension Modules
 -----------------
 
+- Bug #1467450: On Mac OS X 10.3, RTLD_GLOBAL is now used as the
+  default mode for loading shared libraries in ctypes.
 
 What's New in Python 2.5 beta 2?
 ================================