From: Pedro Alves Date: Thu, 26 Apr 2018 12:01:26 +0000 (+0100) Subject: Fix elf_gnu_ifunc_resolve_by_got buglet X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=28f4fa4d0540ac6a23930202f39782167667e373;p=binutils-gdb.git Fix elf_gnu_ifunc_resolve_by_got buglet The next patch will add a call to elf_gnu_ifunc_resolve_by_got that trips on a latent buglet -- the function is writing to its output parameter even if the address wasn't found, confusing the caller. The function's intro comment says: /* Try to find the target resolved function entry address of a STT_GNU_IFUNC function NAME. If the address is found it is stored to *ADDR_P (if ADDR_P is not NULL) and the function returns 1. It returns 0 otherwise. So fix the function accordingly. gdb/ChangeLog: 2018-04-26 Pedro Alves * elfread.c (elf_gnu_ifunc_resolve_by_got): Don't write to *ADDR_P unless we actually resolved the ifunc. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 67e1babcba2..9de1b109aa2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2018-04-26 Pedro Alves + + * elfread.c (elf_gnu_ifunc_resolve_by_got): Don't write to *ADDR_P + unless we actually resolved the ifunc. + 2018-04-26 Pedro Alves * c-exp.y (variable production): Prefer ifunc minsyms over diff --git a/gdb/elfread.c b/gdb/elfread.c index 16a692d3713..42a2c92e9c6 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -833,10 +833,12 @@ elf_gnu_ifunc_resolve_by_got (const char *name, CORE_ADDR *addr_p) ¤t_target); addr = gdbarch_addr_bits_remove (gdbarch, addr); - if (addr_p) - *addr_p = addr; if (elf_gnu_ifunc_record_cache (name, addr)) - return 1; + { + if (addr_p != NULL) + *addr_p = addr; + return 1; + } } return 0;