public inbox for binutils-cvs@sourceware.org
 help / color / mirror / Atom feed
* [binutils-gdb] readelf: Use section names for displaying RELR relocs
@ 2024-05-29 15:08 Szabolcs Nagy
  0 siblings, 0 replies; only message in thread
From: Szabolcs Nagy @ 2024-05-29 15:08 UTC (permalink / raw)
  To: binutils-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d565a958286ac727899bfe44a2512462d73a3797

commit d565a958286ac727899bfe44a2512462d73a3797
Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date:   Tue May 28 17:23:41 2024 +0100

    readelf: Use section names for displaying RELR relocs
    
    In some cases using section names instead of symbol names for
    displaying an address is more useful.
    
    If the symbol falls outside the section where the address is
    then likely it is not useful to display the address relative to.
    
    And if symbols are stripped from a binary then printing the
    section that contains the address is more useful than printing
    <no sym>.

Diff:
---
 binutils/readelf.c | 32 ++++++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/binutils/readelf.c b/binutils/readelf.c
index 1c0f0254abc..5d1cf9c3388 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -1536,7 +1536,8 @@ uses_msp430x_relocs (Filedata * filedata)
 
 
 static const char *
-get_symbol_at (Elf_Internal_Sym *  symtab,
+get_symbol_at (Filedata *          filedata,
+	       Elf_Internal_Sym *  symtab,
 	       uint64_t            nsyms,
 	       char *              strtab,
 	       uint64_t            where,
@@ -1574,17 +1575,32 @@ get_symbol_at (Elf_Internal_Sym *  symtab,
 	beg = sym + 1;
     }
 
-  if (best == NULL)
+  const char *name;
+
+  /* If there is a section start closer than the found symbol then
+     use that for symbolizing the address.  */
+  Elf_Internal_Shdr *sec = find_section_by_address (filedata, where);
+  if (sec != NULL
+      && where - sec->sh_addr < dist
+      && section_name_valid (filedata, sec))
+    {
+      name = section_name (filedata, sec);
+      dist = where - sec->sh_addr;
+    }
+  else if (best != NULL)
+    name = strtab + best->st_name;
+  else
     return NULL;
 
   if (offset_return != NULL)
     * offset_return = dist;
 
-  return strtab + best->st_name;
+  return name;
 }
 
 static void
-print_relr_addr_and_sym (Elf_Internal_Sym *  symtab,
+print_relr_addr_and_sym (Filedata *          filedata,
+			 Elf_Internal_Sym *  symtab,
 			 uint64_t            nsyms,
 			 char *              strtab,
 			 uint64_t            where)
@@ -1595,7 +1611,7 @@ print_relr_addr_and_sym (Elf_Internal_Sym *  symtab,
   print_vma (where, ZERO_HEX);
   printf ("  ");
 
-  symname = get_symbol_at (symtab, nsyms, strtab, where, & offset);
+  symname = get_symbol_at (filedata, symtab, nsyms, strtab, where, & offset);
 
   if (symname == NULL)
     printf ("<no sym>");
@@ -1869,7 +1885,7 @@ dump_relr_relocations (Filedata *          filedata,
       if ((entry & 1) == 0)
 	{
 	  where = entry;
-	  print_relr_addr_and_sym (symtab, nsyms, strtab, where);
+	  print_relr_addr_and_sym (filedata, symtab, nsyms, strtab, where);
 	  printf ("\n");
 	  where += relr_entsize;
 	}
@@ -1893,13 +1909,13 @@ dump_relr_relocations (Filedata *          filedata,
 		
 		if (first)
 		  {
-		    print_relr_addr_and_sym (symtab, nsyms, strtab, addr);
+		    print_relr_addr_and_sym (filedata, symtab, nsyms, strtab, addr);
 		    first = false;
 		  }
 		else
 		  {
 		    printf (_("\n%*s "), relr_entsize == 4 ? 15 : 23, " ");
-		    print_relr_addr_and_sym (symtab, nsyms, strtab, addr);
+		    print_relr_addr_and_sym (filedata, symtab, nsyms, strtab, addr);
 		  }
 	      }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-05-29 15:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-05-29 15:08 [binutils-gdb] readelf: Use section names for displaying RELR relocs Szabolcs Nagy

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).