I have added the patch to sourceforge's patch tracker: http://sourceforge.net/tracker/index.php? func=detail&aid=1454844&group_id=5470&atid=305470
Since this patch is going to be of primary interest to mac people, I would appreciate it if anyone interested in making mac python (a) load extensions like other pythons, and (b) load extensions as per the python documentation would look at, comment on, and/or test the patch. This patch has already been tested by myself and one other on 10.2, 10.3, and 10.4, so I'm confident that it works as advertised, and that there's no reason it should not be applied to the python codebase. Thanks, Zach Pincus Program in Biomedical Informatics and Department of Biochemistry Stanford University School of Medicine On Mar 20, 2006, at 1:05 AM, Ronald Oussoren wrote: > > On 20-mrt-2006, at 4:13, Zachary Pincus wrote: > >> Hello folks, >> >> Here is a patch to make Python on OS X 10.3 and above use dlopen() >> (via dynload_shlib.c) to load extension modules, and to make the dl >> module avaliable. It ought to be incorporated into the SVN for python >> 2.5, if not for further development on 2.4. >> >> If this is an inappropriate channel for this patch, please let me >> know to where I should direct it. Bob Ippolito initially suggested >> this patch be sent hither. > > > Please file this patch on sourceforge.net (www.sf.net/projects/python) > > Ronald > >> >> Zach Pincus >> Program in Biomedical Informatics and Department of Biochemistry >> Stanford University School of Medicine >> >> >> RATIONALE >> --------- >> On most other unix-like operating systems, Python uses the dlopen() >> call to load extension modules. In addition, the way that these >> modules are opened can be modified via 'sys.setdlopenflags(...)'. >> >> Modifications of how extensions are loaded are useful for several >> reasons (enough so that the standard Python docs (e.g. http:// >> docs.python.org/lib/module-sys.html ). In particular, if multiple >> modules need to share symbols, a call to sys.setdlopenflags is >> necessary. >> >> Symbol sharing is especially important for interoperability of >> modules which wrap C++ classes, because GCC creates classes that >> resolve their run-time type identification by symbol identity. Thus, >> symbols must be shared globally for many C++ features to work >> properly for objects passed between modules. >> >> On OS X / Darwin, Python uses some NeXT-derived APIs to load modules. >> Though these APIs provide analogues to the dlopenflags used to >> control how dlopen() loads modules, this interface is *not* exposed >> to the Python interpreter. Worse, sys.setdlopenflags remains >> available on Darwin, though calls to it are never heeded. >> >> Fortunately, on OS X 10.3 and above, Apple has included dlopen as a >> standard function. In 10.3, this call is provided by a compatibility >> API; in 10.4, the dlopen() call is written to interface directly with >> the library loading mechanism and is now the recommended method for >> libraries to be opened for non Carbon/Cocoa tools. >> >> IMPLEMENTATION >> -------------- >> This (trivial) patch instructs the Python build process to use >> dynload_shlib.c (which uses dlopen) instead of dynload_next.c (which >> uses the NeXT-derived APIs). It also allows for the dl module to be >> built in order to provide access to the proper values for the various >> dlopen flags. >> >> TESTING >> ------- >> This patch can be configured and built into executables that build >> and test correctly on 10.3 and 10.4. The patch is nominally targeted >> at the SVN head as of today, but can be applied (and I have done so >> with success) to Python 2.4.2. >> >> Because Python 2.5 and 2.4 do not currently compile properly on OS X >> 10.2, I have not built or tested this patch on that OS version. >> However, the configure and compile process does select the >> appropriate dynload_next.c file to use, and compiles that correctly >> before breaking elsewhere. Thus, if the other errors are fixed for >> 10.2, these patches will work fine. (This is because they only change >> Python's behavior for 10.3 and up.) >> >> PATCHES >> ------- >> Here are three sets of patches, as unified diffs. >> >> FIRST: Patch the configure.in file to use dynload_shlib.c when it >> can. Also regenerate the configure script. >> >> Index: configure.in >> =================================================================== >> --- configure.in (revision 43150) >> +++ configure.in (working copy) >> @@ -2105,7 +2105,8 @@ >> ;; >> BeOS*) DYNLOADFILE="dynload_beos.o";; >> hp*|HP*) DYNLOADFILE="dynload_hpux.o";; >> - Darwin/*) DYNLOADFILE="dynload_next.o";; >> + # Use dynload_next.c only on 10.2 and below, which don't have >> native dlopen() >> + Darwin/@<:@0123456@:>@.*) DYNLOADFILE="dynload_next.o";; >> atheos*) DYNLOADFILE="dynload_atheos.o";; >> *) >> # use dynload_shlib.c and dlopen() if we have it; otherwise >> stub >> Index: configure >> =================================================================== >> --- configure (revision 43150) >> +++ configure (working copy) >> @@ -1,5 +1,5 @@ >> #! /bin/sh >> -# From configure.in Revision: 42437 . >> +# From configure.in Revision: 42563 . >> # Guess values for system-dependent variables and create Makefiles. >> # Generated by GNU Autoconf 2.59 for python 2.5. >> # >> @@ -13974,7 +13974,8 @@ >> ;; >> BeOS*) DYNLOADFILE="dynload_beos.o";; >> hp*|HP*) DYNLOADFILE="dynload_hpux.o";; >> - Darwin/*) DYNLOADFILE="dynload_next.o";; >> + # Use dynload_next.c only on 10.2 and below, which don't have >> native dlopen() >> + Darwin/[0123456].*) DYNLOADFILE="dynload_next.o";; >> atheos*) DYNLOADFILE="dynload_atheos.o";; >> *) >> # use dynload_shlib.c and dlopen() if we have it; otherwise >> stub >> >> >> >> SECOND: Allow the dl module to be built and tested >> >> >> Index: setup.py >> =================================================================== >> --- setup.py (revision 43150) >> +++ setup.py (working copy) >> @@ -883,7 +883,7 @@ >> if sys.maxint == 0x7fffffff: >> # This requires sizeof(int) == sizeof(long) == sizeof >> (char*) >> dl_inc = find_file('dlfcn.h', [], inc_dirs) >> - if (dl_inc is not None) and (platform not in ['atheos', >> 'darwin']): >> + if (dl_inc is not None) and (platform not in >> ['atheos']): >> exts.append( Extension('dl', ['dlmodule.c']) ) >> # Thomas Heller's _ctypes module >> Index: Lib/test/test_dl.py >> =================================================================== >> --- Lib/test/test_dl.py (revision 43150) >> +++ Lib/test/test_dl.py (working copy) >> @@ -10,6 +10,7 @@ >> ('/usr/lib/libc.so', 'getpid'), >> ('/lib/libc.so.6', 'getpid'), >> ('/usr/bin/cygwin1.dll', 'getpid'), >> + ('/usr/lib/libc.dylib', 'getpid'), >> ] >> for s, func in sharedlibs: >> >> >> >> THIRD: (optional) Tell Python that the dl test is not expected to be >> skipped anymore. This is optional because if Python is ever built on >> 10.2, the test script will expect dl to work, when it only works on >> 10.3 and above. However, if Python on 10.2 is officially not >> supported, then this change should be made to properly test the dl >> functionality. >> >> >> Index: Lib/test/regrtest.py >> =================================================================== >> --- Lib/test/regrtest.py (revision 43150) >> +++ Lib/test/regrtest.py (working copy) >> @@ -930,7 +930,6 @@ >> test_cd >> test_cl >> test_curses >> - test_dl >> test_gdbm >> test_gl >> test_imgfile >> >> _______________________________________________ >> Pythonmac-SIG maillist - Pythonmac-SIG@python.org >> http://mail.python.org/mailman/listinfo/pythonmac-sig > _______________________________________________ Pythonmac-SIG maillist - Pythonmac-SIG@python.org http://mail.python.org/mailman/listinfo/pythonmac-sig