From: jdolecek at NetBSD dot org Operating system: Mac OS X 10.4 PHP version: 5.2.4 PHP Bug Type: Dynamic loading Bug description: dlopen() should be preferred to NSLinkModule()
Description: ------------ PHP uses NSLinkModule()-based interface for loading dynamic extensions. Since Mac OS X 10.4, dlopen() is now available as native function and should be used in preference to older NSLinkModule()-based method, for consistency with other UNIX platforms. Fix - if dlopen() is available, use dlopen(), otherwise fallback to NSLinkModule(): --- Zend/zend.h.orig 2007-09-05 00:16:02.000000000 +0200 +++ Zend/zend.h @@ -80,18 +80,7 @@ # include <dlfcn.h> #endif -#if HAVE_MACH_O_DYLD_H -#include <mach-o/dyld.h> - -/* MH_BUNDLE loading functions for Mac OS X / Darwin */ -void *zend_mh_bundle_load (char* bundle_path); -int zend_mh_bundle_unload (void *bundle_handle); -void *zend_mh_bundle_symbol(void *bundle_handle, const char *symbol_name); -const char *zend_mh_bundle_error(void); - -#endif /* HAVE_MACH_O_DYLD_H */ - -#if defined(HAVE_LIBDL) && !defined(HAVE_MACH_O_DYLD_H) && !defined(ZEND_WIN32) +#if defined(HAVE_LIBDL) && !defined(ZEND_WIN32) # ifndef RTLD_LAZY # define RTLD_LAZY 1 /* Solaris 1, FreeBSD's (2.1.7.1 and older) */ @@ -118,6 +107,14 @@ const char *zend_mh_bundle_error(void); # define DL_HANDLE void * # define ZEND_EXTENSIONS_SUPPORT 1 #elif defined(HAVE_MACH_O_DYLD_H) + +#include <mach-o/dyld.h> + +/* MH_BUNDLE loading functions for Mac OS X / Darwin */ +void *zend_mh_bundle_load (char* bundle_path); +int zend_mh_bundle_unload (void *bundle_handle); +void *zend_mh_bundle_symbol(void *bundle_handle, const char *symbol_name); +const char *zend_mh_bundle_error(void); # define DL_LOAD(libname) zend_mh_bundle_load(libname) # define DL_UNLOAD zend_mh_bundle_unload # define DL_FETCH_SYMBOL(h,s) zend_mh_bundle_symbol(h,s) --- Zend/zend_extensions.c.orig 2007-09-05 00:24:04.000000000 +0200 +++ Zend/zend_extensions.c @@ -230,7 +230,7 @@ ZEND_API zend_extension *zend_get_extens * */ -#if HAVE_MACH_O_DYLD_H +#if defined(HAVE_MACH_O_DYLD_H) && !defined(HAVE_LIBDL) void *zend_mh_bundle_load(char* bundle_path) { @@ -284,7 +284,7 @@ const char *zend_mh_bundle_error(void) return NULL; } -#endif /* HAVE_MACH_O_DYLD_H */ +#endif /* HAVE_MACH_O_DYLD_H && !HAVE_LIBDL */ /* * Local variables: Reproduce code: --------------- I've originally developed this patch as a fix to bug #42629 to make extensions load with RTLD_GLOBAL. However, I found simplier fix to that problem, so I'm filling this dlopen() change as a separate bug report. -- Edit bug report at http://bugs.php.net/?id=42630&edit=1 -- Try a CVS snapshot (PHP 4.4): http://bugs.php.net/fix.php?id=42630&r=trysnapshot44 Try a CVS snapshot (PHP 5.2): http://bugs.php.net/fix.php?id=42630&r=trysnapshot52 Try a CVS snapshot (PHP 6.0): http://bugs.php.net/fix.php?id=42630&r=trysnapshot60 Fixed in CVS: http://bugs.php.net/fix.php?id=42630&r=fixedcvs Fixed in release: http://bugs.php.net/fix.php?id=42630&r=alreadyfixed Need backtrace: http://bugs.php.net/fix.php?id=42630&r=needtrace Need Reproduce Script: http://bugs.php.net/fix.php?id=42630&r=needscript Try newer version: http://bugs.php.net/fix.php?id=42630&r=oldversion Not developer issue: http://bugs.php.net/fix.php?id=42630&r=support Expected behavior: http://bugs.php.net/fix.php?id=42630&r=notwrong Not enough info: http://bugs.php.net/fix.php?id=42630&r=notenoughinfo Submitted twice: http://bugs.php.net/fix.php?id=42630&r=submittedtwice register_globals: http://bugs.php.net/fix.php?id=42630&r=globals PHP 3 support discontinued: http://bugs.php.net/fix.php?id=42630&r=php3 Daylight Savings: http://bugs.php.net/fix.php?id=42630&r=dst IIS Stability: http://bugs.php.net/fix.php?id=42630&r=isapi Install GNU Sed: http://bugs.php.net/fix.php?id=42630&r=gnused Floating point limitations: http://bugs.php.net/fix.php?id=42630&r=float No Zend Extensions: http://bugs.php.net/fix.php?id=42630&r=nozend MySQL Configuration Error: http://bugs.php.net/fix.php?id=42630&r=mysqlcfg