From b820cd55a3da42132123a874b69c9be3777c0ca0 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Wed, 19 Jun 2024 19:18:23 +0200 Subject: [gdb/build] Redo poisoning of PyObject_CallMethod In commit 764af878259 ("[gdb/python] Add typesafe wrapper around PyObject_CallMethod") I added poisoning of PyObject_CallMethod: ... /* Poison PyObject_CallMethod. The typesafe wrapper gdbpy_call_method should be used instead. */ template PyObject * PyObject_CallMethod (Args...); ... The idea was that subsequent code would be forced to use gdbpy_call_method instead of PyObject_CallMethod. However, that caused build issues with gcc 14 and python 3.13: ... /usr/bin/ld: python/py-disasm.o: in function `gdb::ref_ptr<_object, gdbpy_ref_policy<_object> > gdbpy_call_method(_object*, char const*, unsigned int, long long)': /data/vries/gdb/src/gdb/python/python-internal.h:207:(.text+0x384f): undefined reference to `_object* PyObject_CallMethod<_object*, char*, char*, unsigned int, long long>(_object*, char*, char*, unsigned int, long long)' /usr/bin/ld: python/py-tui.o: in function `gdb::ref_ptr<_object, gdbpy_ref_policy<_object> > gdbpy_call_method(_object*, char const*, int)': /data/vries/gdb/src/gdb/python/python-internal.h:207:(.text+0x1235): undefined reference to `_object* PyObject_CallMethod<_object*, char*, char*, int>(_object*, char*, char*, int)' /usr/bin/ld: python/py-tui.o: in function `gdb::ref_ptr<_object, gdbpy_ref_policy<_object> > gdbpy_call_method(_object*, char const*, int, int, int)': /data/vries/gdb/src/gdb/python/python-internal.h:207:(.text+0x12b0): undefined reference to `_object* PyObject_CallMethod<_object*, char*, char*, int, int, int>(_object*, char*, char*, int, int, int)' collect2: error: ld returned 1 exit status ... Fix this by poisoning without using templates. Tested on x86_64-linux. --- gdb/python/python-internal.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index fec0010..f25cd3b 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -231,9 +231,11 @@ gdbpy_call_method (const gdbpy_ref<> &o, const char *method, Args... args) /* Poison PyObject_CallMethod. The typesafe wrapper gdbpy_call_method should be used instead. */ #undef PyObject_CallMethod -template -PyObject * -PyObject_CallMethod (Args...); +#ifdef __GNUC__ +# pragma GCC poison PyObject_CallMethod +#else +# define PyObject_CallMethod POISONED_PyObject_CallMethod +#endif /* The 'name' parameter of PyErr_NewException was missing the 'const' qualifier in Python <= 3.4. Hence, we wrap it in a function to -- cgit v1.1