diff options
-rw-r--r-- | Misc/NEWS.d/next/macOS/2023-10-31-22-13-05.gh-issue-59703.SML6Ag.rst | 4 | ||||
-rw-r--r-- | Modules/getpath.c | 17 |
2 files changed, 10 insertions, 11 deletions
diff --git a/Misc/NEWS.d/next/macOS/2023-10-31-22-13-05.gh-issue-59703.SML6Ag.rst b/Misc/NEWS.d/next/macOS/2023-10-31-22-13-05.gh-issue-59703.SML6Ag.rst new file mode 100644 index 0000000..eeb014d --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2023-10-31-22-13-05.gh-issue-59703.SML6Ag.rst @@ -0,0 +1,4 @@ +For macOS framework builds, in ``getpath.c`` use the system ``dladdr`` +function to find the path to the shared library rather than depending +on deprecated macOS APIs. + diff --git a/Modules/getpath.c b/Modules/getpath.c index 50ba090..be1a9cf 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -17,7 +17,7 @@ #endif #ifdef __APPLE__ -# include <mach-o/dyld.h> +# include <dlfcn.h> #endif /* Reference the precompiled getpath.py */ @@ -768,16 +768,11 @@ library_to_dict(PyObject *dict, const char *key) which is in the framework, not relative to the executable, which may be outside of the framework. Except when we're in the build directory... */ - NSSymbol symbol = NSLookupAndBindSymbol("_Py_Initialize"); - if (symbol != NULL) { - NSModule pythonModule = NSModuleForSymbol(symbol); - if (pythonModule != NULL) { - /* Use dylib functions to find out where the framework was loaded from */ - const char *path = NSLibraryNameForModule(pythonModule); - if (path) { - strncpy(modPath, path, MAXPATHLEN); - modPathInitialized = 1; - } + Dl_info pythonInfo; + if (dladdr(&Py_Initialize, &pythonInfo)) { + if (pythonInfo.dli_fname) { + strncpy(modPath, pythonInfo.dli_fname, MAXPATHLEN); + modPathInitialized = 1; } } } |