aboutsummaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2021-02-14 16:40:01 +1030
committerAlan Modra <amodra@gmail.com>2021-02-14 22:54:12 +1030
commit1944212b426d2e13cc4bb24aa1a850bbc572e624 (patch)
tree2eeb87749918f031c33dc4a8a64c2a3f5e077e6e /binutils
parent0d0a0d86c841a95226d9cc7c247c770c38fdc81b (diff)
downloadfsf-binutils-gdb-1944212b426d2e13cc4bb24aa1a850bbc572e624.zip
fsf-binutils-gdb-1944212b426d2e13cc4bb24aa1a850bbc572e624.tar.gz
fsf-binutils-gdb-1944212b426d2e13cc4bb24aa1a850bbc572e624.tar.bz2
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.
Diffstat (limited to 'binutils')
-rw-r--r--binutils/ChangeLog7
-rw-r--r--binutils/objdump.c53
2 files changed, 32 insertions, 28 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 19e7461..12ff93d 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,5 +1,12 @@
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.
* doc/Makefile.in: Regenerate.
diff --git a/binutils/objdump.c b/binutils/objdump.c
index fde5f59..3047850 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 *));
}
}