]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb: make Python conftest compatible with Python limited C API
authorMatthieu Longo <matthieu.longo@arm.com>
Wed, 16 Jul 2025 16:17:36 +0000 (17:17 +0100)
committerMatthieu Longo <matthieu.longo@arm.com>
Wed, 15 Oct 2025 15:23:13 +0000 (16:23 +0100)
The current test to check the support of '--dynamic-list' linker flag
uses PyRun_SimpleString (), which is part of the unstable API. As it is
now, the test will systematically fail due to the undefined symbol
rather than testing the import of ctypes.
This patch replaces PyRun_SimpleString () by an equivalent code relying
on the limited C API, and compatible with Python 3.4.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=23830
Approved-By: Tom Tromey <tom@tromey.com>
gdb/configure
gdb/configure.ac

index db63481b1c6bfdd55cabc0eb3484fb36684f5fd8..b7a2079d2062c11a54483d0f6f763144bc7a8730 100755 (executable)
@@ -31034,11 +31034,18 @@ else
 int
 main ()
 {
-int err;
+
+          const char *code = "import ctypes\n";
           Py_Initialize ();
-          err = PyRun_SimpleString ("import ctypes\n");
+          PyObject *main_module = PyImport_AddModule ("__main__");
+          PyObject *global_dict = PyModule_GetDict (main_module);
+          PyObject *local_dict = PyDict_New ();
+          PyObject *py_code = Py_CompileString (code, "test", Py_single_input);
+          if (py_code == NULL)
+            return 1;
+          PyObject *res = PyEval_EvalCode (py_code, global_dict, local_dict);
           Py_Finalize ();
-          return err == 0 ? 0 : 1;
+          return res ? 0 : 1;
   ;
   return 0;
 }
index 52924106bca436a810dc502c3a98e3b60a653d57..a88b6ebffe58aa56ad7962d101bdc5aeb1e5ce22 100644 (file)
@@ -1761,11 +1761,18 @@ if test "${gdb_native}" = yes; then
      AC_RUN_IFELSE(
        [AC_LANG_PROGRAM(
          [#include "Python.h"],
-         [int err;
+         [
+          const char *code = "import ctypes\n";
           Py_Initialize ();
-          err = PyRun_SimpleString ("import ctypes\n");
+          PyObject *main_module = PyImport_AddModule ("__main__");
+          PyObject *global_dict = PyModule_GetDict (main_module);
+          PyObject *local_dict = PyDict_New ();
+          PyObject *py_code = Py_CompileString (code, "test", Py_single_input);
+          if (py_code == NULL)
+            return 1;
+          PyObject *res = PyEval_EvalCode (py_code, global_dict, local_dict);
           Py_Finalize ();
-          return err == 0 ? 0 : 1;])],
+          return res ? 0 : 1;])],
        [dynamic_list=true], [], [true])
      LIBS="$old_LIBS"
      CFLAGS="$old_CFLAGS"