mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
bpo-44689: ctypes.util.find_library() now finds macOS 11+ system libraries when built on older macOS systems (#27251)
Previously, when built on older macOS systems, `find_library` was not able to find macOS system libraries when running on Big Sur due to changes in how system libraries are stored.
This commit is contained in:
parent
d3bdbbf9a4
commit
71853a7302
2 changed files with 31 additions and 3 deletions
|
@ -0,0 +1,5 @@
|
||||||
|
:meth:`ctypes.util.find_library` now works correctly on macOS 11 Big Sur
|
||||||
|
even if Python is built on an older version of macOS. Previously, when
|
||||||
|
built on older macOS systems, ``find_library`` was not able to find
|
||||||
|
macOS system libraries when running on Big Sur due to changes in
|
||||||
|
how system libraries are stored.
|
|
@ -1442,14 +1442,37 @@ copy_com_pointer(PyObject *self, PyObject *args)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
#ifdef __APPLE__
|
||||||
#ifdef HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH
|
#ifdef HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH
|
||||||
|
#define HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH_RUNTIME \
|
||||||
|
__builtin_available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
||||||
|
#else
|
||||||
|
// Support the deprecated case of compiling on an older macOS version
|
||||||
|
static void *libsystem_b_handle;
|
||||||
|
static bool (*_dyld_shared_cache_contains_path)(const char *path);
|
||||||
|
|
||||||
|
__attribute__((constructor)) void load_dyld_shared_cache_contains_path(void) {
|
||||||
|
libsystem_b_handle = dlopen("/usr/lib/libSystem.B.dylib", RTLD_LAZY);
|
||||||
|
if (libsystem_b_handle != NULL) {
|
||||||
|
_dyld_shared_cache_contains_path = dlsym(libsystem_b_handle, "_dyld_shared_cache_contains_path");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((destructor)) void unload_dyld_shared_cache_contains_path(void) {
|
||||||
|
if (libsystem_b_handle != NULL) {
|
||||||
|
dlclose(libsystem_b_handle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#define HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH_RUNTIME \
|
||||||
|
_dyld_shared_cache_contains_path != NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
static PyObject *py_dyld_shared_cache_contains_path(PyObject *self, PyObject *args)
|
static PyObject *py_dyld_shared_cache_contains_path(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
PyObject *name, *name2;
|
PyObject *name, *name2;
|
||||||
char *name_str;
|
char *name_str;
|
||||||
|
|
||||||
if (__builtin_available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)) {
|
if (HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH_RUNTIME) {
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "O", &name))
|
if (!PyArg_ParseTuple(args, "O", &name))
|
||||||
|
@ -1992,7 +2015,7 @@ PyMethodDef _ctypes_module_methods[] = {
|
||||||
{"dlclose", py_dl_close, METH_VARARGS, "dlclose a library"},
|
{"dlclose", py_dl_close, METH_VARARGS, "dlclose a library"},
|
||||||
{"dlsym", py_dl_sym, METH_VARARGS, "find symbol in shared library"},
|
{"dlsym", py_dl_sym, METH_VARARGS, "find symbol in shared library"},
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH
|
#ifdef __APPLE__
|
||||||
{"_dyld_shared_cache_contains_path", py_dyld_shared_cache_contains_path, METH_VARARGS, "check if path is in the shared cache"},
|
{"_dyld_shared_cache_contains_path", py_dyld_shared_cache_contains_path, METH_VARARGS, "check if path is in the shared cache"},
|
||||||
#endif
|
#endif
|
||||||
{"alignment", align_func, METH_O, alignment_doc},
|
{"alignment", align_func, METH_O, alignment_doc},
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue