public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* Commit: objdump --show-all-symbols: show extra symbols matching referenced addresses
@ 2024-04-03  9:08 Nick Clifton
  2024-04-03  9:17 ` Andreas Schwab
  0 siblings, 1 reply; 5+ messages in thread
From: Nick Clifton @ 2024-04-03  9:08 UTC (permalink / raw)
  To: binutils

[-- Attachment #1: Type: text/plain, Size: 1610 bytes --]

Hi Guys,

  Objcopy's --show-all-symbols option displays all the symbols matching
  an address that is being disassembled.  But currently it does not show
  any extra symbols that might match an address that is referenced by an
  instruction.  For example:

    $ objdump --disassemble=abort /lib64/libc.so.6 --show-all-symbols
    [...]
    269bb:	e8 40 6f 0b 00       	call   dd900 <_exit>

  I am applying the attached patch to fix this omission.  Given the
  example above the output now looks like:

    $ objdump --disassemble=abort /lib64/libc.so.6 --show-all-symbols --wide
    [...]
    269bb:	e8 40 6f 0b 00       	call   dd900 <_exit>, <_Exit>, <__GI__exit>

  Without the --wide option, the extra symbols are displayed on a new
  line:
  
    $ objdump --disassemble=abort /lib64/libc.so.6 --show-all-symbols --wide
    [...]
    269bb:	e8 40 6f 0b 00       	call   dd900 <_exit>,
	<_Exit>, <__GI__exit>

  As an addition, if the first symbol that matches the address is an
  absolute location obtained from a relocation, then the patch will
  decode the location and display any symbols that match.  This is
  particularly helpful when displaying branches into the PLT.

  Before patch:

    $ objdump --disassemble=__gconv_alias_compare /lib64/libc.so.6 --show-all-symbols --wide
    [...]
    28f2a:	e9 31 d8 ff ff      jmp    26760 <*ABS*+0xa4450@plt>

  After patch:
  
    $ objdump --disassemble=__gconv_alias_compare /lib64/libc.so.6 --show-all-symbols --wide
    [...]
    28f2a:	e9 31 d8 ff ff     jmp    26760 <*ABS*+0xa4450@plt>, <strcmp_ifunc>, <strcmp>, <__GI_strcmp>

Cheers
  Nick


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: show-all-symbols.patch --]
[-- Type: text/x-patch, Size: 2771 bytes --]

diff --git a/binutils/objdump.c b/binutils/objdump.c
index 68da543e905..6396174d50f 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -1652,6 +1652,42 @@ objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
 			      (long int)(sec->filepos + (vma - sec->vma)));
 }
 
+/* Displays all symbols in the sorted symbol table starting at PLACE
+   which match the address VMA.  Assumes that show_all_symbols == true.  */
+
+static void
+display_extra_syms (long place,
+		    bfd_vma vma,
+		    struct disassemble_info *inf)
+{
+  struct objdump_disasm_info *aux = (struct objdump_disasm_info *) inf->application_data;
+
+  if (place == 0)
+    return;
+
+  bool first = true;
+
+  for (; place < sorted_symcount; place++)
+    {
+      asymbol *sym = sorted_syms[place];
+		  
+      if (bfd_asymbol_value (sym) != vma)
+	break;
+
+      if (! inf->symbol_is_valid (sym, inf))
+	continue;
+
+      if (first && ! do_wide)
+	inf->fprintf_styled_func (inf->stream, dis_style_immediate, ",\n\t<");
+      else  
+	inf->fprintf_styled_func (inf->stream, dis_style_immediate, ", <");
+
+      objdump_print_symname (aux->abfd, inf, sym);
+      inf->fprintf_styled_func (inf->stream, dis_style_immediate, ">");
+      first = false;
+    }
+}
+		    
 /* Print an address (VMA), symbolically if possible.
    If SKIP_ZEROES is TRUE, don't output leading zeroes.  */
 
@@ -1663,6 +1699,7 @@ objdump_print_addr (bfd_vma vma,
   struct objdump_disasm_info *aux;
   asymbol *sym = NULL;
   bool skip_find = false;
+  long place = 0;
 
   aux = (struct objdump_disasm_info *) inf->application_data;
 
@@ -1696,10 +1733,34 @@ objdump_print_addr (bfd_vma vma,
     }
 
   if (!skip_find)
-    sym = find_symbol_for_address (vma, inf, NULL);
+    sym = find_symbol_for_address (vma, inf, &place);
 
   objdump_print_addr_with_sym (aux->abfd, inf->section, sym, vma, inf,
 			       skip_zeroes);
+
+  /* If requested, display any extra symbols at this address.  */
+  if (sym == NULL || ! show_all_symbols)
+    return;
+
+  if (place)
+    display_extra_syms (place + 1, vma, inf);
+    
+  /* If we found an absolute symbol in the reloc (ie: "*ABS*+0x....")
+     and there is a valid symbol at the address contained in the absolute symbol
+     then display any extra symbols that match this address.  This helps
+     particularly with relocations for PLT entries.  */
+  if (startswith (sym->name, BFD_ABS_SECTION_NAME "+"))
+    {
+      bfd_vma addr = strtoul (sym->name + strlen (BFD_ABS_SECTION_NAME "+"), NULL, 0);
+
+      if (addr && addr != vma)
+	{
+	  sym = find_symbol_for_address (addr, inf, &place);
+
+	  if (sym)
+	    display_extra_syms (place, addr, inf);
+	}
+    }
 }
 
 /* Print VMA to INFO.  This function is passed to the disassembler

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-04-03  9:55 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-03  9:08 Commit: objdump --show-all-symbols: show extra symbols matching referenced addresses Nick Clifton
2024-04-03  9:17 ` Andreas Schwab
2024-04-03  9:37   ` Nick Clifton
2024-04-03  9:46     ` Andreas Schwab
2024-04-03  9:55       ` Nick Clifton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).