From de2715f086bc799b20e420a82b76180338352565 Mon Sep 17 00:00:00 2001 From: AN Long Date: Tue, 21 Nov 2023 13:15:25 +0800 Subject: gh-59703: use the system dladdr function in getpath.c for macOS framework builds (GH-111546) Co-authored-by: Ned Deily --- .../macOS/2023-10-31-22-13-05.gh-issue-59703.SML6Ag.rst | 4 ++++ Modules/getpath.c | 17 ++++++----------- 2 files changed, 10 insertions(+), 11 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2023-10-31-22-13-05.gh-issue-59703.SML6Ag.rst 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 +# include #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; } } } -- cgit v0.12