On 23/06/26 06:27, Muhammad Kamran wrote: > > > On 23/06/2026 04:00, Thiago Jung Bauermann wrote: >> Hello Yury, >> >> Yury Khrustalev <[email protected]> writes: >> >>> Hi, thanks for this report. >>> >>> I've looked into these issues, and it seems like most of them are caused by >>> how GDB treats malloc function for evaluating expressions that require a >>> function call. >>> >>> GDB seems to ignore that malloc has become n ifunc in Glibc and it tries to >>> access symbol 'malloc' directly. >>> >>> It seems like GDB has been having some issues with ifuncs before, e.g. [1]. >>> >>> Simple way to reproduce the issue: use a program with just empty main >>> function: >>> >>> int main(void) { return 0; } >>> >>> In GDB (not that __libc_malloc is the implementation that is returned by the >>> ifunc resolver): >>> >>> (gdb) br main >>> (gdb) r >>> (gdb) disassemble __libc_malloc >>> >>> Notice first 2 instructions >>> >>> (gdb) call printf("%s\n", "hello") >>> >>> Might result in SIGILL or SIGSEGV... but if it works, it prints format >>> string >>> instead of 'hello'. >>> >>> (gdb) disassemble __libc_malloc >>> >>> Notice first 2 instructions have now been re-written with gibberish (hence >>> the >>> signals). >>> >>> I would appreciate if this could be looked at from the GDB point of view. >>> Perhaps, >>> this should be fixed in GDB? >>> >>> FWIW, lldb works as expected. >> >> Thank you for the investigation and the detailed report. >> I was able to reproduce the problem and will work on a fix. > > Hi Thiago, > > I’ve spent some time looking into this issue. The problem appears to be in > find_function_in_inferior, which GDB uses when expression evaluation needs to > call functions in the inferior, such as malloc for allocating storage for > string literal arguments. > > When the lookup falls back to a minimal symbol, GDB constructs a synthetic > function type from the symbol address. For GNU IFUNC symbols such as malloc, > this path loses the IFUNC marker, causing the inferior call machinery to > treat the symbol as an ordinary function and skip IFUNC resolution. > > The patch below preserves the IFUNC property when creating the synthetic > function type. With this change, Yury’s reproducer behaves correctly on my > setup. > > Does this look like a reasonable approach to you?
Thanks for working on this Kamran. One thing that worries me is this ifunc change made glibc hard to debug on old gdb without this fix. Usually newer glibc versions take some time to be deployed widely, and deployers also use more recent binutils versions along it. _______________________________________________ linaro-toolchain mailing list -- [email protected] To unsubscribe send an email to [email protected]
