]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-32280: Store _PyRuntime in a named section (GH-4802)
authorMax Bélanger <aeromax@gmail.com>
Thu, 3 Jun 2021 23:37:29 +0000 (16:37 -0700)
committerGitHub <noreply@github.com>
Thu, 3 Jun 2021 23:37:29 +0000 (00:37 +0100)
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>
Python/pylifecycle.c

index 2dbebe45fd4b0be16b6cd6b4be83bb8457a804cb..d31a9c15fd1ec57ff59f9bc5df73099f798cf87b 100644 (file)
 
 #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