Skip to content

Commit

Permalink
bpo-44689: ctypes.util.find_library() now finds macOS 11+ system libr…
Browse files Browse the repository at this point in the history
…aries when built on older macOS systems (GH-27251) (GH-28053)

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.
(cherry picked from commit 71853a7)

Co-authored-by: Tobias Bergkvist <tobias@bergkv.ist>
  • Loading branch information
miss-islington and bergkvist authored Aug 30, 2021
1 parent d0f94ab commit 4b55837
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -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.
29 changes: 26 additions & 3 deletions Modules/_ctypes/callproc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1449,14 +1449,37 @@ copy_com_pointer(PyObject *self, PyObject *args)
return r;
}
#else

#ifdef __APPLE__
#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)
{
PyObject *name, *name2;
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;

if (!PyArg_ParseTuple(args, "O", &name))
Expand Down Expand Up @@ -1999,7 +2022,7 @@ PyMethodDef _ctypes_module_methods[] = {
{"dlclose", py_dl_close, METH_VARARGS, "dlclose a library"},
{"dlsym", py_dl_sym, METH_VARARGS, "find symbol in shared library"},
#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"},
#endif
{"alignment", align_func, METH_O, alignment_doc},
Expand Down

0 comments on commit 4b55837

Please sign in to comment.