mirror of https://github.com/python/cpython
gh-100540: Remove obsolete Modules/_ctypes/darwin/ dlfcn shim (GH-100541)
As far as I can tell, this hasn't been actually used since Mac OS X 10.2.
This commit is contained in:
parent
7223d50b97
commit
2df82db485
|
@ -2591,7 +2591,7 @@ MODULE_MATH_DEPS=$(srcdir)/Modules/_math.h
|
|||
MODULE_PYEXPAT_DEPS=@LIBEXPAT_INTERNAL@
|
||||
MODULE_UNICODEDATA_DEPS=$(srcdir)/Modules/unicodedata_db.h $(srcdir)/Modules/unicodename_db.h
|
||||
MODULE__BLAKE2_DEPS=$(srcdir)/Modules/_blake2/impl/blake2-config.h $(srcdir)/Modules/_blake2/impl/blake2-impl.h $(srcdir)/Modules/_blake2/impl/blake2.h $(srcdir)/Modules/_blake2/impl/blake2b-load-sse2.h $(srcdir)/Modules/_blake2/impl/blake2b-load-sse41.h $(srcdir)/Modules/_blake2/impl/blake2b-ref.c $(srcdir)/Modules/_blake2/impl/blake2b-round.h $(srcdir)/Modules/_blake2/impl/blake2b.c $(srcdir)/Modules/_blake2/impl/blake2s-load-sse2.h $(srcdir)/Modules/_blake2/impl/blake2s-load-sse41.h $(srcdir)/Modules/_blake2/impl/blake2s-load-xop.h $(srcdir)/Modules/_blake2/impl/blake2s-ref.c $(srcdir)/Modules/_blake2/impl/blake2s-round.h $(srcdir)/Modules/_blake2/impl/blake2s.c $(srcdir)/Modules/_blake2/blake2module.h $(srcdir)/Modules/hashlib.h
|
||||
MODULE__CTYPES_DEPS=$(srcdir)/Modules/_ctypes/ctypes.h $(srcdir)/Modules/_ctypes/darwin/dlfcn.h
|
||||
MODULE__CTYPES_DEPS=$(srcdir)/Modules/_ctypes/ctypes.h
|
||||
MODULE__CTYPES_MALLOC_CLOSURE=@MODULE__CTYPES_MALLOC_CLOSURE@
|
||||
MODULE__DECIMAL_DEPS=$(srcdir)/Modules/_decimal/docstrings.h @LIBMPDEC_INTERNAL@
|
||||
MODULE__ELEMENTTREE_DEPS=$(srcdir)/Modules/pyexpat.c @LIBEXPAT_INTERNAL@
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Removed obsolete ``dlfcn.h`` shim from the ``_ctypes`` extension module,
|
||||
which has not been necessary since Mac OS X 10.2.
|
|
@ -120,7 +120,7 @@ bytes(cdata)
|
|||
#define IS_INTRESOURCE(x) (((size_t)(x) >> 16) == 0)
|
||||
#endif
|
||||
#else
|
||||
#include "ctypes_dlfcn.h"
|
||||
#include <dlfcn.h>
|
||||
#endif
|
||||
#include "ctypes.h"
|
||||
|
||||
|
@ -768,7 +768,7 @@ CDataType_in_dll(PyObject *type, PyObject *args)
|
|||
return NULL;
|
||||
}
|
||||
#else
|
||||
address = (void *)ctypes_dlsym(handle, name);
|
||||
address = (void *)dlsym(handle, name);
|
||||
if (!address) {
|
||||
#ifdef __CYGWIN__
|
||||
/* dlerror() isn't very helpful on cygwin */
|
||||
|
@ -776,7 +776,7 @@ CDataType_in_dll(PyObject *type, PyObject *args)
|
|||
"symbol '%s' not found",
|
||||
name);
|
||||
#else
|
||||
PyErr_SetString(PyExc_ValueError, ctypes_dlerror());
|
||||
PyErr_SetString(PyExc_ValueError, dlerror());
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
|
@ -3560,7 +3560,7 @@ PyCFuncPtr_FromDll(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
return NULL;
|
||||
}
|
||||
#else
|
||||
address = (PPROC)ctypes_dlsym(handle, name);
|
||||
address = (PPROC)dlsym(handle, name);
|
||||
if (!address) {
|
||||
#ifdef __CYGWIN__
|
||||
/* dlerror() isn't very helpful on cygwin */
|
||||
|
@ -3568,7 +3568,7 @@ PyCFuncPtr_FromDll(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
"function '%s' not found",
|
||||
name);
|
||||
#else
|
||||
PyErr_SetString(PyExc_AttributeError, ctypes_dlerror());
|
||||
PyErr_SetString(PyExc_AttributeError, dlerror());
|
||||
#endif
|
||||
Py_DECREF(ftuple);
|
||||
return NULL;
|
||||
|
|
|
@ -67,7 +67,7 @@
|
|||
#include <windows.h>
|
||||
#include <tchar.h>
|
||||
#else
|
||||
#include "ctypes_dlfcn.h"
|
||||
#include <dlfcn.h>
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
|
@ -1537,10 +1537,10 @@ static PyObject *py_dl_open(PyObject *self, PyObject *args)
|
|||
if (PySys_Audit("ctypes.dlopen", "O", name) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
handle = ctypes_dlopen(name_str, mode);
|
||||
handle = dlopen(name_str, mode);
|
||||
Py_XDECREF(name2);
|
||||
if (!handle) {
|
||||
const char *errmsg = ctypes_dlerror();
|
||||
const char *errmsg = dlerror();
|
||||
if (!errmsg)
|
||||
errmsg = "dlopen() error";
|
||||
PyErr_SetString(PyExc_OSError,
|
||||
|
@ -1558,7 +1558,7 @@ static PyObject *py_dl_close(PyObject *self, PyObject *args)
|
|||
return NULL;
|
||||
if (dlclose(handle)) {
|
||||
PyErr_SetString(PyExc_OSError,
|
||||
ctypes_dlerror());
|
||||
dlerror());
|
||||
return NULL;
|
||||
}
|
||||
Py_RETURN_NONE;
|
||||
|
@ -1576,10 +1576,10 @@ static PyObject *py_dl_sym(PyObject *self, PyObject *args)
|
|||
if (PySys_Audit("ctypes.dlsym/handle", "O", args) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
ptr = ctypes_dlsym((void*)handle, name);
|
||||
ptr = dlsym((void*)handle, name);
|
||||
if (!ptr) {
|
||||
PyErr_SetString(PyExc_OSError,
|
||||
ctypes_dlerror());
|
||||
dlerror());
|
||||
return NULL;
|
||||
}
|
||||
return PyLong_FromVoidPtr(ptr);
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
#ifndef _CTYPES_DLFCN_H_
|
||||
#define _CTYPES_DLFCN_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#ifndef MS_WIN32
|
||||
|
||||
#include <dlfcn.h>
|
||||
|
||||
#ifndef CTYPES_DARWIN_DLFCN
|
||||
|
||||
#define ctypes_dlsym dlsym
|
||||
#define ctypes_dlerror dlerror
|
||||
#define ctypes_dlopen dlopen
|
||||
#define ctypes_dlclose dlclose
|
||||
#define ctypes_dladdr dladdr
|
||||
|
||||
#endif /* !CTYPES_DARWIN_DLFCN */
|
||||
|
||||
#endif /* !MS_WIN32 */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
#endif /* _CTYPES_DLFCN_H_ */
|
|
@ -1,31 +0,0 @@
|
|||
Copyright (c) 2002 Jorge Acereda <jacereda@users.sourceforge.net> &
|
||||
Peter O'Gorman <ogorman@users.sourceforge.net>
|
||||
|
||||
Portions may be copyright others, see the AUTHORS file included with this
|
||||
distribution.
|
||||
|
||||
Maintained by Peter O'Gorman <ogorman@users.sourceforge.net>
|
||||
|
||||
Bug Reports and other queries should go to <ogorman@users.sourceforge.net>
|
||||
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
|
@ -1,95 +0,0 @@
|
|||
dlcompat for Darwin
|
||||
=========================
|
||||
|
||||
This is dlcompat, a small library that emulates the dlopen()
|
||||
interface on top of Darwin's dyld API.
|
||||
|
||||
dlcompat allows loading a ".dylib" library (as long as the RTLD_LOCAL
|
||||
flag isn't passed to dlopen()). It can be configured to yield a warning
|
||||
when trying to close it (dynamic libraries cannot currently be unloaded).
|
||||
|
||||
It automatically searches for modules in several directories when no
|
||||
absolute path is specified and the module is not found in the current
|
||||
directory.
|
||||
|
||||
The paths searched are those specified in the environment variables
|
||||
LD_LIBRARY_PATH and DYLD_LIBRARY_PATH plus /lib, /usr/local/lib and
|
||||
/usr/lib or the path specified in the environment variable
|
||||
DYLD_FALLBACK_LIBRARY_PATH.
|
||||
|
||||
In the default install the behavior of dlsym is to automatically prepend
|
||||
an underscore to passed in symbol names, this allows easier porting of
|
||||
applications which were written specifically for ELF based lifeforms.
|
||||
|
||||
Installation
|
||||
--------------
|
||||
Type:
|
||||
./configure
|
||||
make
|
||||
sudo make install
|
||||
|
||||
This will compile the source file, generate both a static and shared
|
||||
library called libdl and install it into /usr/local/lib. The header
|
||||
file dlfcn.h will be installed in /usr/local/include.
|
||||
|
||||
If you want to place the files somewhere else, run
|
||||
|
||||
make clean
|
||||
./configure --prefix=<prefix>
|
||||
make
|
||||
sudo make install
|
||||
|
||||
where <prefix> is the hierarchy you want to install into, e.g. /usr
|
||||
for /usr/lib and /usr/include (_NOT_ recommended!).
|
||||
|
||||
To enable debugging output (useful for me), run
|
||||
|
||||
make clean
|
||||
./configure --enable-debug
|
||||
make
|
||||
sudo make install
|
||||
|
||||
If you want old dlcompat style behavior of not prepending the underscore
|
||||
on calls to dlsym then type:
|
||||
|
||||
make clean
|
||||
./configure --enable-fink
|
||||
make
|
||||
sudo make install
|
||||
|
||||
Usage
|
||||
-------
|
||||
Software that uses GNU autoconf will likely check for a library called
|
||||
libdl, that's why I named it that way. For software that doesn't find
|
||||
the library on its own, you must add a '-ldl' to the appropriate
|
||||
Makefile (or environment) variable, usually LIBS.
|
||||
|
||||
If you installed dlcompat into a directory other than /usr/local/lib,
|
||||
you must tell the compiler where to find it. Add '-L<prefix>/lib' to
|
||||
LDFLAGS (or CFLAGS) and '-I<prefix>/include' to CPPFLAGS (or CFLAGS).
|
||||
|
||||
Notes
|
||||
-----
|
||||
If you are writing new software and plan to have Mac OX X compatibility you
|
||||
should look at the dyld api's in /usr/include/mach-o/dyld.h, rather than
|
||||
using dlcompat, using the native api's is the supported method of loading
|
||||
dynamically on Mac OS X, if you want an small example, look at dlfcn_simple.c,
|
||||
which should help get you started.
|
||||
|
||||
Also note that the functions in dlcompat are not thread safe, and while it is not
|
||||
POSIX spec compliant, it is about as close to compliance as it is going to get though.
|
||||
|
||||
You can always get the latest version from opendarwin cvs:
|
||||
|
||||
cvs -d :pserver:anonymous@anoncvs.opendarwin.org:/cvs/od login
|
||||
cvs -z3 -d :pserver:anonymous@anoncvs.opendarwin.org:/cvs/od \
|
||||
co -d dlcompat proj/dlcompat
|
||||
|
||||
|
||||
It is hoped that this library will be useful, and as bug free as possible, if you find
|
||||
any bugs please let us know about them so they can be fixed.
|
||||
|
||||
Please send bug reports to Peter O'Gorman <ogorman@users.sourceforge.net>
|
||||
|
||||
Thanks.
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
The files in this directory are taken from
|
||||
http://www.opendarwin.org/cgi-bin/cvsweb.cgi/~checkout~/proj/dlcompat/
|
||||
|
||||
The LICENSE in this directory applies to these files.
|
||||
|
||||
Thomas Heller, Jan 2003
|
||||
|
||||
These files have been modified so they fall back to the system
|
||||
dlfcn calls if available in libSystem.
|
||||
|
||||
Bob Ippolito, Feb 2006
|
|
@ -1,84 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2002 Jorge Acereda <jacereda@users.sourceforge.net> &
|
||||
Peter O'Gorman <ogorman@users.sourceforge.net>
|
||||
|
||||
Portions may be copyright others, see the AUTHORS file included with this
|
||||
distribution.
|
||||
|
||||
Maintained by Peter O'Gorman <ogorman@users.sourceforge.net>
|
||||
|
||||
Bug Reports and other queries should go to <ogorman@users.sourceforge.net>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef _DLFCN_H_
|
||||
#define _DLFCN_H_
|
||||
|
||||
#include <AvailabilityMacros.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Structure filled in by dladdr().
|
||||
*/
|
||||
|
||||
typedef struct dl_info {
|
||||
const char *dli_fname; /* Pathname of shared object */
|
||||
void *dli_fbase; /* Base address of shared object */
|
||||
const char *dli_sname; /* Name of nearest symbol */
|
||||
void *dli_saddr; /* Address of nearest symbol */
|
||||
} Dl_info;
|
||||
|
||||
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_2
|
||||
#warning CTYPES_DARWIN_DLFCN
|
||||
#define CTYPES_DARWIN_DLFCN
|
||||
extern void * (*ctypes_dlopen)(const char *path, int mode);
|
||||
extern void * (*ctypes_dlsym)(void * handle, const char *symbol);
|
||||
extern const char * (*ctypes_dlerror)(void);
|
||||
extern int (*ctypes_dlclose)(void * handle);
|
||||
extern int (*ctypes_dladdr)(const void *, Dl_info *);
|
||||
#else
|
||||
extern void * dlopen(const char *path, int mode);
|
||||
extern void * dlsym(void * handle, const char *symbol);
|
||||
extern const char * dlerror(void);
|
||||
extern int dlclose(void * handle);
|
||||
extern int dladdr(const void *, Dl_info *);
|
||||
#endif
|
||||
|
||||
#define RTLD_LAZY 0x1
|
||||
#define RTLD_NOW 0x2
|
||||
#define RTLD_LOCAL 0x4
|
||||
#define RTLD_GLOBAL 0x8
|
||||
#define RTLD_NOLOAD 0x10
|
||||
#define RTLD_NODELETE 0x80
|
||||
|
||||
/* These are from the Mac OS X 10.4 headers */
|
||||
#define RTLD_NEXT ((void *) -1) /* Search subsequent objects. */
|
||||
#define RTLD_DEFAULT ((void *) -2) /* Use default search algorithm. */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _DLFCN_H_ */
|
|
@ -1,272 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2002 Peter O'Gorman <ogorman@users.sourceforge.net>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
/* Just to prove that it isn't that hard to add Mac calls to your code :)
|
||||
This works with pretty much everything, including kde3 xemacs and the gimp,
|
||||
I'd guess that it'd work in at least 95% of cases, use this as your starting
|
||||
point, rather than the mess that is dlfcn.c, assuming that your code does not
|
||||
require ref counting or symbol lookups in dependent libraries
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <stdarg.h>
|
||||
#include <limits.h>
|
||||
#include <mach-o/dyld.h>
|
||||
#include <AvailabilityMacros.h>
|
||||
#include "dlfcn.h"
|
||||
|
||||
#ifdef CTYPES_DARWIN_DLFCN
|
||||
|
||||
#define ERR_STR_LEN 256
|
||||
|
||||
#ifndef MAC_OS_X_VERSION_10_3
|
||||
#define MAC_OS_X_VERSION_10_3 1030
|
||||
#endif
|
||||
|
||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
|
||||
#define DARWIN_HAS_DLOPEN
|
||||
extern void * dlopen(const char *path, int mode) __attribute__((weak_import));
|
||||
extern void * dlsym(void * handle, const char *symbol) __attribute__((weak_import));
|
||||
extern const char * dlerror(void) __attribute__((weak_import));
|
||||
extern int dlclose(void * handle) __attribute__((weak_import));
|
||||
extern int dladdr(const void *, Dl_info *) __attribute__((weak_import));
|
||||
#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 */
|
||||
|
||||
#ifndef DARWIN_HAS_DLOPEN
|
||||
#define dlopen darwin_dlopen
|
||||
#define dlsym darwin_dlsym
|
||||
#define dlerror darwin_dlerror
|
||||
#define dlclose darwin_dlclose
|
||||
#define dladdr darwin_dladdr
|
||||
#endif
|
||||
|
||||
void * (*ctypes_dlopen)(const char *path, int mode);
|
||||
void * (*ctypes_dlsym)(void * handle, const char *symbol);
|
||||
const char * (*ctypes_dlerror)(void);
|
||||
int (*ctypes_dlclose)(void * handle);
|
||||
int (*ctypes_dladdr)(const void *, Dl_info *);
|
||||
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_3
|
||||
/* Mac OS X 10.3+ has dlopen, so strip all this dead code to avoid warnings */
|
||||
|
||||
static void *dlsymIntern(void *handle, const char *symbol);
|
||||
|
||||
static const char *error(int setget, const char *str, ...);
|
||||
|
||||
/* Set and get the error string for use by dlerror */
|
||||
static const char *error(int setget, const char *str, ...)
|
||||
{
|
||||
static char errstr[ERR_STR_LEN];
|
||||
static int err_filled = 0;
|
||||
const char *retval;
|
||||
va_list arg;
|
||||
if (setget == 0)
|
||||
{
|
||||
va_start(arg, str);
|
||||
strncpy(errstr, "dlcompat: ", ERR_STR_LEN);
|
||||
vsnprintf(errstr + 10, ERR_STR_LEN - 10, str, arg);
|
||||
va_end(arg);
|
||||
err_filled = 1;
|
||||
retval = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!err_filled)
|
||||
retval = NULL;
|
||||
else
|
||||
retval = errstr;
|
||||
err_filled = 0;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* darwin_dlopen */
|
||||
static void *darwin_dlopen(const char *path, int mode)
|
||||
{
|
||||
void *module = 0;
|
||||
NSObjectFileImage ofi = 0;
|
||||
NSObjectFileImageReturnCode ofirc;
|
||||
|
||||
/* If we got no path, the app wants the global namespace, use -1 as the marker
|
||||
in this case */
|
||||
if (!path)
|
||||
return (void *)-1;
|
||||
|
||||
/* Create the object file image, works for things linked with the -bundle arg to ld */
|
||||
ofirc = NSCreateObjectFileImageFromFile(path, &ofi);
|
||||
switch (ofirc)
|
||||
{
|
||||
case NSObjectFileImageSuccess:
|
||||
/* It was okay, so use NSLinkModule to link in the image */
|
||||
module = NSLinkModule(ofi, path,
|
||||
NSLINKMODULE_OPTION_RETURN_ON_ERROR
|
||||
| (mode & RTLD_GLOBAL) ? 0 : NSLINKMODULE_OPTION_PRIVATE
|
||||
| (mode & RTLD_LAZY) ? 0 : NSLINKMODULE_OPTION_BINDNOW);
|
||||
NSDestroyObjectFileImage(ofi);
|
||||
break;
|
||||
case NSObjectFileImageInappropriateFile:
|
||||
/* It may have been a dynamic library rather than a bundle, try to load it */
|
||||
module = (void *)NSAddImage(path, NSADDIMAGE_OPTION_RETURN_ON_ERROR);
|
||||
break;
|
||||
default:
|
||||
/* God knows what we got */
|
||||
error(0, "Can not open \"%s\"", path);
|
||||
return 0;
|
||||
}
|
||||
if (!module)
|
||||
error(0, "Can not open \"%s\"", path);
|
||||
return module;
|
||||
|
||||
}
|
||||
|
||||
/* dlsymIntern is used by dlsym to find the symbol */
|
||||
static void *dlsymIntern(void *handle, const char *symbol)
|
||||
{
|
||||
NSSymbol nssym = 0;
|
||||
/* If the handle is -1, if is the app global context */
|
||||
if (handle == (void *)-1)
|
||||
{
|
||||
/* Global context, use NSLookupAndBindSymbol */
|
||||
if (NSIsSymbolNameDefined(symbol))
|
||||
{
|
||||
nssym = NSLookupAndBindSymbol(symbol);
|
||||
}
|
||||
|
||||
}
|
||||
/* Now see if the handle is a struch mach_header* or not, use NSLookupSymbol in image
|
||||
for libraries, and NSLookupSymbolInModule for bundles */
|
||||
else
|
||||
{
|
||||
/* Check for both possible magic numbers depending on x86/ppc byte order */
|
||||
if ((((struct mach_header *)handle)->magic == MH_MAGIC) ||
|
||||
(((struct mach_header *)handle)->magic == MH_CIGAM))
|
||||
{
|
||||
if (NSIsSymbolNameDefinedInImage((struct mach_header *)handle, symbol))
|
||||
{
|
||||
nssym = NSLookupSymbolInImage((struct mach_header *)handle,
|
||||
symbol,
|
||||
NSLOOKUPSYMBOLINIMAGE_OPTION_BIND
|
||||
| NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
nssym = NSLookupSymbolInModule(handle, symbol);
|
||||
}
|
||||
}
|
||||
if (!nssym)
|
||||
{
|
||||
error(0, "Symbol \"%s\" Not found", symbol);
|
||||
return NULL;
|
||||
}
|
||||
return NSAddressOfSymbol(nssym);
|
||||
}
|
||||
|
||||
static const char *darwin_dlerror(void)
|
||||
{
|
||||
return error(1, (char *)NULL);
|
||||
}
|
||||
|
||||
static int darwin_dlclose(void *handle)
|
||||
{
|
||||
if ((((struct mach_header *)handle)->magic == MH_MAGIC) ||
|
||||
(((struct mach_header *)handle)->magic == MH_CIGAM))
|
||||
{
|
||||
error(0, "Can't remove dynamic libraries on darwin");
|
||||
return 0;
|
||||
}
|
||||
if (!NSUnLinkModule(handle, 0))
|
||||
{
|
||||
error(0, "unable to unlink module %s", NSNameOfModule(handle));
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* dlsym, prepend the underscore and call dlsymIntern */
|
||||
static void *darwin_dlsym(void *handle, const char *symbol)
|
||||
{
|
||||
static char undersym[257]; /* Saves calls to malloc(3) */
|
||||
int sym_len = strlen(symbol);
|
||||
void *value = NULL;
|
||||
char *malloc_sym = NULL;
|
||||
|
||||
if (sym_len < 256)
|
||||
{
|
||||
snprintf(undersym, 256, "_%s", symbol);
|
||||
value = dlsymIntern(handle, undersym);
|
||||
}
|
||||
else
|
||||
{
|
||||
malloc_sym = malloc(sym_len + 2);
|
||||
if (malloc_sym)
|
||||
{
|
||||
sprintf(malloc_sym, "_%s", symbol);
|
||||
value = dlsymIntern(handle, malloc_sym);
|
||||
free(malloc_sym);
|
||||
}
|
||||
else
|
||||
{
|
||||
error(0, "Unable to allocate memory");
|
||||
}
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
static int darwin_dladdr(const void *handle, Dl_info *info) {
|
||||
return 0;
|
||||
}
|
||||
#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_3 */
|
||||
|
||||
#if __GNUC__ < 4
|
||||
#pragma CALL_ON_LOAD ctypes_dlfcn_init
|
||||
#else
|
||||
static void __attribute__ ((constructor)) ctypes_dlfcn_init(void);
|
||||
static
|
||||
#endif
|
||||
void ctypes_dlfcn_init(void) {
|
||||
if (dlopen != NULL) {
|
||||
ctypes_dlsym = dlsym;
|
||||
ctypes_dlopen = dlopen;
|
||||
ctypes_dlerror = dlerror;
|
||||
ctypes_dlclose = dlclose;
|
||||
ctypes_dladdr = dladdr;
|
||||
} else {
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_3
|
||||
ctypes_dlsym = darwin_dlsym;
|
||||
ctypes_dlopen = darwin_dlopen;
|
||||
ctypes_dlerror = darwin_dlerror;
|
||||
ctypes_dlclose = darwin_dlclose;
|
||||
ctypes_dladdr = darwin_dladdr;
|
||||
#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_3 */
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* CTYPES_DARWIN_DLFCN */
|
|
@ -102,7 +102,6 @@
|
|||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\Modules\_ctypes\ctypes.h" />
|
||||
<ClInclude Include="..\Modules\_ctypes\ctypes_dlfcn.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\Modules\_ctypes\_ctypes.c" />
|
||||
|
|
|
@ -15,9 +15,6 @@
|
|||
<ClInclude Include="..\Modules\_ctypes\ctypes.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\Modules\_ctypes\ctypes_dlfcn.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\Modules\_ctypes\_ctypes.c">
|
||||
|
|
|
@ -51,7 +51,6 @@ EXCLUDED = clean_lines('''
|
|||
# @begin=conf@
|
||||
|
||||
# OSX
|
||||
#Modules/_ctypes/darwin/*.c
|
||||
Modules/_scproxy.c # SystemConfiguration/SystemConfiguration.h
|
||||
|
||||
# Windows
|
||||
|
|
|
@ -12802,8 +12802,7 @@ if test "x$have_libffi" = xyes; then :
|
|||
case $ac_sys_system in #(
|
||||
Darwin) :
|
||||
|
||||
as_fn_append LIBFFI_CFLAGS " -I\$(srcdir)/Modules/_ctypes/darwin"
|
||||
ctypes_malloc_closure=yes
|
||||
ctypes_malloc_closure=yes
|
||||
;; #(
|
||||
sunos5) :
|
||||
as_fn_append LIBFFI_LIBS " -mimpure-text"
|
||||
|
|
|
@ -3741,7 +3741,6 @@ AS_VAR_IF([have_libffi], [yes], [
|
|||
AS_CASE([$ac_sys_system],
|
||||
[Darwin], [
|
||||
dnl when do we need USING_APPLE_OS_LIBFFI?
|
||||
AS_VAR_APPEND([LIBFFI_CFLAGS], [" -I\$(srcdir)/Modules/_ctypes/darwin"])
|
||||
ctypes_malloc_closure=yes
|
||||
],
|
||||
[sunos5], [AS_VAR_APPEND([LIBFFI_LIBS], [" -mimpure-text"])]
|
||||
|
|
Loading…
Reference in New Issue