mirror of
https://github.com/python/cpython.git
synced 2025-12-31 04:23:37 +00:00
GH-127970: find the runtime library when dladdr is available (#127972)
This commit is contained in:
parent
eb26e17069
commit
95cd9c669c
5 changed files with 30 additions and 23 deletions
|
|
@ -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.
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
6
configure
generated
vendored
6
configure
generated
vendored
|
|
@ -19001,6 +19001,12 @@ if test "x$ac_cv_func_ctermid" = xyes
|
|||
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
|
||||
|
|
|
|||
|
|
@ -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 \
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue