Fix calling ifunc functions when resolver has debug info and different name
authorPedro Alves <palves@redhat.com>
Thu, 26 Apr 2018 12:01:26 +0000 (13:01 +0100)
committerPedro Alves <palves@redhat.com>
Thu, 26 Apr 2018 12:04:09 +0000 (13:04 +0100)
Currently, on Fedora 27 (glibc 2.26), if you try to call strlen in the
inferior you get:

 (gdb) p strlen ("hello")
 $1 = (size_t (*)(const char *)) 0x7ffff554aac0 <__strlen_avx2>

strlen is an ifunc function, and what we see above is the result of
calling the ifunc resolver in the inferior.  That returns a pointer to
the actual target function that implements strlen on my machine.  GDB
should have turned around and called the resolver automatically
without the user noticing.

This is was caused by commit:

  commit bf223d3e808e6fec9ee165d3d48beb74837796de
  Date: Mon Aug 21 11:34:32 2017 +0100

      Handle function aliases better (PR gdb/19487, errno printing)

which added the find_function_alias_target call to c-exp.y, to try to
find an alias with debug info for a minsym.  For ifunc symbols, that
finds the ifunc's resolver if it has debug info (in the example it's
called "strlen_ifunc"), with the result that GDB calls that as a
regular function.

After this commit, we get now get:

  (top-gdb) p strlen ("hello")
  '__strlen_avx2' has unknown return type; cast the call to its declared return type

Which is correct, because __strlen_avx2 is written in assembly.
That'll be improved in a following patch, though.

gdb/ChangeLog:
2018-04-26  Pedro Alves  <palves@redhat.com>

* c-exp.y (variable production): Skip finding an alias for ifunc
symbols.

gdb/ChangeLog
gdb/c-exp.y

index 3266d7fc621760c602df80d9eb068467705ebf58..e23eeee0d07a3589dd38df2d9be2fb66bfd7662d 100644 (file)
@@ -1,3 +1,8 @@
+2018-04-26  Pedro Alves  <palves@redhat.com>
+
+       * c-exp.y (variable production): Skip finding an alias for ifunc
+       symbols.
+
 2018-04-26  Pedro Alves  <palves@redhat.com>
 
        * elfread.c (elf_rel_plt_read): Look for relocations for .got.plt too.
index 8dc3c068a5e2a8d2d66ba8096d16aaa53ac773e2..e2ea07cd792836f1b3b08ba6b5b3391e863e1633 100644 (file)
@@ -1081,7 +1081,9 @@ variable: name_not_typename
                                 is important for example for "p
                                 *__errno_location()".  */
                              symbol *alias_target
-                               = find_function_alias_target (msymbol);
+                               = (msymbol.minsym->type != mst_text_gnu_ifunc
+                                  ? find_function_alias_target (msymbol)
+                                  : NULL);
                              if (alias_target != NULL)
                                {
                                  write_exp_elt_opcode (pstate, OP_VAR_VALUE);