summaryrefslogtreecommitdiffstats
path: root/Python/pylifecycle.c
diff options
context:
space:
mode:
authorMax BĂ©langer <aeromax@gmail.com>2021-06-03 23:37:29 (GMT)
committerGitHub <noreply@github.com>2021-06-03 23:37:29 (GMT)
commit35002aa8f62dda1f79035e9904abdf476683e9be (patch)
tree58fdd104fc8b80fcc3c345840988dada1106881c /Python/pylifecycle.c
parentb250f89bb7e05e72a4641d44b988866b919575db (diff)
downloadcpython-35002aa8f62dda1f79035e9904abdf476683e9be.zip
cpython-35002aa8f62dda1f79035e9904abdf476683e9be.tar.gz
cpython-35002aa8f62dda1f79035e9904abdf476683e9be.tar.bz2
bpo-32280: Store _PyRuntime in a named section (GH-4802)
This commit stores the _PyRuntime structure in a section of the same name. This allows a debugging or crash reporting tool to quickly locate this structure at runtime without requiring the symbol table. Co-authored-by: Pablo Galindo <pablogsal@gmail.com>
Diffstat (limited to 'Python/pylifecycle.c')
-rw-r--r--Python/pylifecycle.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 2dbebe4..d31a9c1 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -17,6 +17,10 @@
#include <locale.h> // setlocale()
+#if defined(__APPLE__)
+#include <mach-o/loader.h>
+#endif
+
#ifdef HAVE_SIGNAL_H
# include <signal.h> // SIG_IGN
#endif
@@ -34,7 +38,6 @@
(PyObject_TypeCheck((op), &PyWindowsConsoleIO_Type))
#endif
-
#define PUTS(fd, str) _Py_write_noraise(fd, str, (int)strlen(str))
@@ -59,7 +62,30 @@ static void wait_for_thread_shutdown(PyThreadState *tstate);
static void call_ll_exitfuncs(_PyRuntimeState *runtime);
int _Py_UnhandledKeyboardInterrupt = 0;
-_PyRuntimeState _PyRuntime = _PyRuntimeState_INIT;
+
+/* The following places the `_PyRuntime` structure in a location that can be
+ * found without any external information. This is meant to ease access to the
+ * interpreter state for various runtime debugging tools, but is *not* an
+ * officially supported feature */
+
+#if defined(MS_WINDOWS)
+
+#pragma section("PyRuntime", read, write)
+__declspec(allocate("PyRuntime"))
+
+#elif defined(__APPLE__)
+
+__attribute__((
+ section(SEG_DATA ",PyRuntime")
+))
+
+#endif
+
+_PyRuntimeState _PyRuntime
+#if defined(__linux__) && (defined(__GNUC__) || defined(__clang__))
+__attribute__ ((section (".PyRuntime")))
+#endif
+= _PyRuntimeState_INIT;
static int runtime_initialized = 0;
PyStatus