summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS.d/next/Core_and_Builtins/2024-12-15-19-51-54.gh-issue-127970.vdUp-y.rst6
-rw-r--r--Modules/getpath.c38
-rwxr-xr-xconfigure6
-rw-r--r--configure.ac2
-rw-r--r--pyconfig.h.in3
5 files changed, 31 insertions, 24 deletions
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2024-12-15-19-51-54.gh-issue-127970.vdUp-y.rst b/Misc/NEWS.d/next/Core_and_Builtins/2024-12-15-19-51-54.gh-issue-127970.vdUp-y.rst
new file mode 100644
index 0000000..e4dc7b5
--- /dev/null
+++ b/Misc/NEWS.d/next/Core_and_Builtins/2024-12-15-19-51-54.gh-issue-127970.vdUp-y.rst
@@ -0,0 +1,6 @@
+We now use the location of the ``libpython`` runtime library used in the current
+proccess to determine :data:`sys.base_prefix` on all platforms implementing the
+`dladdr <https://pubs.opengroup.org/onlinepubs/9799919799/functions/dladdr.html>`_
+function defined by the UNIX standard — this includes Linux, Android, macOS,
+iOS, FreeBSD, etc. This was already the case on Windows and macOS Framework
+builds.
diff --git a/Modules/getpath.c b/Modules/getpath.c
index 18ddfaf..2d3c975 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -17,10 +17,13 @@
#endif
#ifdef __APPLE__
-# include <dlfcn.h>
# include <mach-o/dyld.h>
#endif
+#ifdef HAVE_DLFCN_H
+# include <dlfcn.h>
+#endif
+
/* Reference the precompiled getpath.py */
#include "Python/frozen_modules/getpath.h"
@@ -803,36 +806,25 @@ progname_to_dict(PyObject *dict, const char *key)
static int
library_to_dict(PyObject *dict, const char *key)
{
+/* macOS framework builds do not link against a libpython dynamic library, but
+ instead link against a macOS Framework. */
+#if defined(Py_ENABLE_SHARED) || defined(WITH_NEXT_FRAMEWORK)
+
#ifdef MS_WINDOWS
-#ifdef Py_ENABLE_SHARED
extern HMODULE PyWin_DLLhModule;
if (PyWin_DLLhModule) {
return winmodule_to_dict(dict, key, PyWin_DLLhModule);
}
#endif
-#elif defined(WITH_NEXT_FRAMEWORK)
- static char modPath[MAXPATHLEN + 1];
- static int modPathInitialized = -1;
- if (modPathInitialized < 0) {
- modPathInitialized = 0;
-
- /* On Mac OS X we have a special case if we're running from a framework.
- This is because the python home should be set relative to the library,
- 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... */
- Dl_info pythonInfo;
- if (dladdr(&Py_Initialize, &pythonInfo)) {
- if (pythonInfo.dli_fname) {
- strncpy(modPath, pythonInfo.dli_fname, MAXPATHLEN);
- modPathInitialized = 1;
- }
- }
- }
- if (modPathInitialized > 0) {
- return decode_to_dict(dict, key, modPath);
+
+#if HAVE_DLADDR
+ Dl_info libpython_info;
+ if (dladdr(&Py_Initialize, &libpython_info) && libpython_info.dli_fname) {
+ return decode_to_dict(dict, key, libpython_info.dli_fname);
}
#endif
+#endif
+
return PyDict_SetItemString(dict, key, Py_None) == 0;
}
diff --git a/configure b/configure
index 6e1b393..bb77c55 100755
--- a/configure
+++ b/configure
@@ -19002,6 +19002,12 @@ then :
printf "%s\n" "#define HAVE_CTERMID 1" >>confdefs.h
fi
+ac_fn_c_check_func "$LINENO" "dladdr" "ac_cv_func_dladdr"
+if test "x$ac_cv_func_dladdr" = xyes
+then :
+ printf "%s\n" "#define HAVE_DLADDR 1" >>confdefs.h
+
+fi
ac_fn_c_check_func "$LINENO" "dup" "ac_cv_func_dup"
if test "x$ac_cv_func_dup" = xyes
then :
diff --git a/configure.ac b/configure.ac
index 6d44be8..653cd3f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5128,7 +5128,7 @@ fi
# checks for library functions
AC_CHECK_FUNCS([ \
accept4 alarm bind_textdomain_codeset chmod chown clock closefrom close_range confstr \
- copy_file_range ctermid dup dup3 execv explicit_bzero explicit_memset \
+ copy_file_range ctermid dladdr dup dup3 execv explicit_bzero explicit_memset \
faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \
gai_strerror getegid geteuid getgid getgrent getgrgid getgrgid_r \
diff --git a/pyconfig.h.in b/pyconfig.h.in
index 874b98d..aaf5216 100644
--- a/pyconfig.h.in
+++ b/pyconfig.h.in
@@ -286,6 +286,9 @@
/* Define if you have the 'dirfd' function or macro. */
#undef HAVE_DIRFD
+/* Define to 1 if you have the 'dladdr' function. */
+#undef HAVE_DLADDR
+
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H