objdump: don't add an extra entry to syms array

Alan Modra amodra@gmail.com
Sun Feb 14 12:22:16 GMT 2021


Space for a NULL is there in every backend bfd_get_symtab_upper_bound
or bfd_get_dynamic_symtab_upper_bound when the symbol count is non-zero,
and placed as a terminator by bfd_canonicalize_symtab.  Many backends
even return a single NULL entry array for zero symbol count, and while
there are a few that return a NULL array for no symbols, that case is
handled fine in objdump.  So don't have objdump add yet another NULL
entry.

	* objdump.c (slurp_symtab): Don't add an extra entry for NULL
	to the symbol array.
	(slurp_dynamic_symtab): Likewise.
	(dump_bfd): Formatting.  Copy terminating NULL from extra_syms.

diff --git a/binutils/objdump.c b/binutils/objdump.c
index fde5f59c9a..304785009b 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -748,32 +748,33 @@ slurp_symtab (bfd *abfd)
       non_fatal (_("failed to read symbol table from: %s"), bfd_get_filename (abfd));
       bfd_fatal (_("error message was"));
     }
-  /* Add an extra entry (at the end) with a NULL pointer.  */
-  storage += sizeof (asymbol *);
 
-  off_t filesize = bfd_get_file_size (abfd);
-
-  /* qv PR 24707.  */
-  if (filesize > 0
-      && filesize < storage
-      /* The MMO file format supports its own special compression
-	 technique, so its sections can be larger than the file size.  */
-      && bfd_get_flavour (abfd) != bfd_target_mmo_flavour)	  
+  if (storage)
     {
-      bfd_nonfatal_message (bfd_get_filename (abfd), abfd, NULL,
-			    _("error: symbol table size (%#lx) is larger than filesize (%#lx)"),
-			    storage, (long) filesize);
-      exit_status = 1;
-      symcount = 0;
-      return NULL;
+      off_t filesize = bfd_get_file_size (abfd);
+
+      /* qv PR 24707.  */
+      if (filesize > 0
+	  && filesize < storage
+	  /* The MMO file format supports its own special compression
+	     technique, so its sections can be larger than the file size.  */
+	  && bfd_get_flavour (abfd) != bfd_target_mmo_flavour)
+	{
+	  bfd_nonfatal_message (bfd_get_filename (abfd), abfd, NULL,
+				_("error: symbol table size (%#lx) "
+				  "is larger than filesize (%#lx)"),
+				storage, (long) filesize);
+	  exit_status = 1;
+	  symcount = 0;
+	  return NULL;
+	}
+
+      sy = (asymbol **) xmalloc (storage);
     }
 
-  sy = (asymbol **) xmalloc (storage);
   symcount = bfd_canonicalize_symtab (abfd, sy);
   if (symcount < 0)
     bfd_fatal (bfd_get_filename (abfd));
-  /* assert (symcount < (storage / sizeof (asymbol *))) */
-  sy[symcount] = NULL;
   return sy;
 }
 
@@ -786,7 +787,6 @@ slurp_dynamic_symtab (bfd *abfd)
   long storage;
 
   storage = bfd_get_dynamic_symtab_upper_bound (abfd);
-  /* Add an extra entry (at the end) with a NULL pointer.  */
   if (storage < 0)
     {
       if (!(bfd_get_file_flags (abfd) & DYNAMIC))
@@ -800,14 +800,12 @@ slurp_dynamic_symtab (bfd *abfd)
       bfd_fatal (bfd_get_filename (abfd));
     }
 
-  storage += sizeof (asymbol *);
-  sy = (asymbol **) xmalloc (storage);
+  if (storage)
+    sy = (asymbol **) xmalloc (storage);
 
   dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
   if (dynsymcount < 0)
     bfd_fatal (bfd_get_filename (abfd));
-  /* assert (symcount < (storage / sizeof (asymbol *))) */
-  sy[dynsymcount] = NULL;
   return sy;
 }
 
@@ -4915,12 +4913,11 @@ dump_bfd (bfd *abfd, bfd_boolean is_mainfile)
 		    }
 		  else
 		    {
-		      syms = xrealloc (syms, (symcount + old_symcount + 1) * sizeof (asymbol *));
+		      syms = xrealloc (syms, ((symcount + old_symcount + 1)
+					      * sizeof (asymbol *)));
 		      memcpy (syms + old_symcount,
 			      extra_syms,
-			      symcount * sizeof (asymbol *));
-		      /* Preserve the NULL entry at the end of the symbol table.  */
-		      syms[symcount + old_symcount] = NULL;
+			      (symcount + 1) * sizeof (asymbol *));
 		    }
 		}
 

-- 
Alan Modra
Australia Development Lab, IBM


More information about the Binutils mailing list