From 1944212b426d2e13cc4bb24aa1a850bbc572e624 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sun, 14 Feb 2021 16:40:01 +1030 Subject: [PATCH] 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/ChangeLog | 7 ++++++ binutils/objdump.c | 53 ++++++++++++++++++++++------------------------ 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 19e746133a7..12ff93dc53a 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,10 @@ +2021-02-14 Alan Modra + + * 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 * Makefile.in: Regenerate. diff --git a/binutils/objdump.c b/binutils/objdump.c index fde5f59c9ac..304785009bf 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 *)); } } -- 2.30.2