Browse Source

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

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.
binutils-2_37-branch
Alan Modra 5 years ago
parent
commit
1944212b42
  1. 7
      binutils/ChangeLog
  2. 53
      binutils/objdump.c

7
binutils/ChangeLog

@ -1,3 +1,10 @@
2021-02-14 Alan Modra <amodra@gmail.com>
* 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.
2021-02-14 Alan Modra <amodra@gmail.com>
* Makefile.in: Regenerate.

53
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 *));
}
}

Loading…
Cancel
Save