--- /dev/null
+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.
#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"
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;
}
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
# 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 \