Test SEC_HAS_CONTENTS before reading section contents
authorAlan Modra <amodra@gmail.com>
Tue, 21 Feb 2023 21:17:36 +0000 (07:47 +1030)
committerAlan Modra <amodra@gmail.com>
Thu, 23 Feb 2023 02:28:53 +0000 (12:58 +1030)
bfd_malloc_and_get_section does size sanity checking before allocating
memory and reading contents.  These size checks are not done for bss
style sections, because they typically don't occupy file space and
thus can't be compared against file size.  However, if you are
expecting to look at something other than a whole lot of zeros, don't
allow fuzzers to avoid the size checking.

* cofflink.c (process_embedded_commands): Don't look at
sections without SEC_HAS_CONTENTS set.
* cpu-arm.c (bfd_arm_update_notes): Likewise.
(bfd_arm_get_mach_from_notes): Likewise.
* elf-eh-frame.c (_bfd_elf_parse_eh_frame): Likewise.
* elf-hppa.h (elf_hppa_sort_unwind): Likewise.
* elf-m10300.c (mn10300_elf_relax_section): Likewise.
* elf-sframe.c (_bfd_elf_parse_sframe): Likewise.
* elf.c (_bfd_elf_print_private_bfd_data): Likewise.
* elf32-arm.c (bfd_elf32_arm_process_before_allocation): Likewise.
* elf32-avr.c (avr_elf32_load_property_records): Likewise.
* elf32-ppc.c (_bfd_elf_ppc_set_arch): Likewise.
(ppc_elf_get_synthetic_symtab, ppc_elf_relax_section): Likewise.
* elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Likewise.
(opd_entry_value, ppc64_elf_edit_opd, ppc64_elf_edit_toc): Likewise.
* elf64-x86-64.c (elf_x86_64_get_synthetic_symtab): Likewise.
* elflink.c (elf_link_add_object_symbols): Likewise.
(bfd_elf_get_bfd_needed_list): Likewise.
* elfnn-aarch64.c (get_plt_type): Likewise.
* elfxx-mips.c (_bfd_mips_elf_get_synthetic_symtab): Likewise.
* linker.c (_bfd_handle_already_linked): Likewise.
* opncls.c (bfd_get_debug_link_info_1): Likewise.
(bfd_get_alt_debug_link_info, get_build_id): Likewise.
* peXXigen.c (pe_print_idata, pe_print_pdata): Likewise.
(_bfd_XX_print_ce_compressed_pdata, pe_print_reloc): Likewise.
* pei-x86_64.c (pex64_bfd_print_pdata_section): Likewise.
* stabs.c (_bfd_link_section_stabs): Likewise.
(_bfd_discard_section_stabs): Likewise.
* xcofflink.c (_bfd_xcoff_get_dynamic_symtab_upper_bound): Likewise.
(_bfd_xcoff_canonicalize_dynamic_symtab): Likewise.
(_bfd_xcoff_get_dynamic_reloc_upper_bound): Likewise.
(_bfd_xcoff_canonicalize_dynamic_reloc): Likewise.
(xcoff_link_add_dynamic_symbols): Likewise.
(xcoff_link_check_dynamic_ar_symbols): Likewise.
(bfd_xcoff_build_dynamic_sections): Likewise.

21 files changed:
bfd/cofflink.c
bfd/cpu-arm.c
bfd/elf-eh-frame.c
bfd/elf-hppa.h
bfd/elf-m10300.c
bfd/elf-sframe.c
bfd/elf.c
bfd/elf32-arm.c
bfd/elf32-avr.c
bfd/elf32-ppc.c
bfd/elf64-ppc.c
bfd/elf64-x86-64.c
bfd/elflink.c
bfd/elfnn-aarch64.c
bfd/elfxx-mips.c
bfd/linker.c
bfd/opncls.c
bfd/peXXigen.c
bfd/pei-x86_64.c
bfd/stabs.c
bfd/xcofflink.c

index 3174bd3aff1a72d8c633e6df3e469b0c9e7a549e..0de2e0bc391089ffc5a834e002cb86c942e61145 100644 (file)
@@ -1213,7 +1213,7 @@ process_embedded_commands (bfd *output_bfd,
   char *e;
   bfd_byte *copy;
 
-  if (!sec)
+  if (sec == NULL || (sec->flags & SEC_HAS_CONTENTS) == 0)
     return 1;
 
   if (!bfd_malloc_and_get_section (abfd, sec, &copy))
index 09bcf5bd27f35a8730cc0478c20f32accab47f4c..03482b0daa08a337f7c0a6762dda2a3ea545f895 100644 (file)
@@ -418,7 +418,8 @@ bfd_arm_update_notes (bfd *abfd, const char *note_section)
      different.  */
   arm_arch_section = bfd_get_section_by_name (abfd, note_section);
 
-  if (arm_arch_section == NULL)
+  if (arm_arch_section == NULL
+      || (arm_arch_section->flags & SEC_HAS_CONTENTS) == 0)
     return true;
 
   buffer_size = arm_arch_section->size;
@@ -521,7 +522,8 @@ bfd_arm_get_mach_from_notes (bfd *abfd, const char *note_section)
      different.  */
   arm_arch_section = bfd_get_section_by_name (abfd, note_section);
 
-  if (arm_arch_section == NULL)
+  if (arm_arch_section == NULL
+      || (arm_arch_section->flags & SEC_HAS_CONTENTS) == 0)
     return bfd_mach_arm_unknown;
 
   buffer_size = arm_arch_section->size;
index 90a5848e6636e661d3c8f120f1a17dc6b244a53e..bf7a990235528bd0343be7b3f615437a8988259e 100644 (file)
@@ -602,6 +602,7 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
   hdr_info = &htab->eh_info;
 
   if (sec->size == 0
+      || (sec->flags & SEC_HAS_CONTENTS) == 0
       || sec->sec_info_type != SEC_INFO_TYPE_NONE)
     {
       /* This file does not contain .eh_frame information.  */
index 7896c02809946bbaaabad06e2b7a35c13b15a231..747c5b1a18cef72414c0c97268e4a26a77e8eedb 100644 (file)
@@ -984,7 +984,8 @@ elf_hppa_sort_unwind (bfd *abfd)
      Consider what happens if someone inept creates a linker script
      that puts unwind information in .text.  */
   s = bfd_get_section_by_name (abfd, ".PARISC.unwind");
-  if (s != NULL)
+  if (s != NULL && (s->flags & SEC_HAS_CONTENTS) != 0)
+
     {
       bfd_size_type size;
       bfd_byte *contents;
index bc3daecba293bc8c7dc82542beb8b2fd2ff857a8..7e084e64b0f96012d3b53af1fb9b4c588865ad0e 100644 (file)
@@ -2694,7 +2694,8 @@ mn10300_elf_relax_section (bfd *abfd,
              if (! ((section->flags & SEC_RELOC) != 0
                     && section->reloc_count != 0))
                continue;
-             if ((section->flags & SEC_ALLOC) == 0)
+             if ((section->flags & SEC_ALLOC) == 0
+                 || (section->flags & SEC_HAS_CONTENTS) == 0)
                continue;
 
              /* Get cached copy of section contents if it exists.  */
@@ -3034,7 +3035,9 @@ mn10300_elf_relax_section (bfd *abfd,
              unsigned int symcount;
 
              /* Skip non-code sections and empty sections.  */
-             if ((section->flags & SEC_CODE) == 0 || section->size == 0)
+             if ((section->flags & SEC_CODE) == 0
+                 || (section->flags & SEC_HAS_CONTENTS) == 0
+                 || section->size == 0)
                continue;
 
              if (section->reloc_count != 0)
index d2954ba919355d96e2087169fafd3fe8ae0f79bb..57d67989bf9fac4e7cd3393b46d35b5120490ecf 100644 (file)
@@ -193,6 +193,7 @@ _bfd_elf_parse_sframe (bfd *abfd,
   int decerr = 0;
 
   if (sec->size == 0
+      || (sec->flags & SEC_HAS_CONTENTS) == 0
       || sec->sec_info_type != SEC_INFO_TYPE_NONE)
     {
       /* This file does not contain .sframe information.  */
index a82a1dd60a6bd018c2ac471b63759aa9e1b1ecf4..37f331b98cdf5101d8e9a1a28425c264cbf0a3a4 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -1689,7 +1689,7 @@ _bfd_elf_print_private_bfd_data (bfd *abfd, void *farg)
     }
 
   s = bfd_get_section_by_name (abfd, ".dynamic");
-  if (s != NULL)
+  if (s != NULL && (s->flags & SEC_HAS_CONTENTS) != 0)
     {
       unsigned int elfsec;
       unsigned long shlink;
index a6d83b97c97d508cb03f460df2354b1f765bcf9b..e07e12226a56d492d45cc65d735ef6fabd69efc3 100644 (file)
@@ -7882,7 +7882,8 @@ bfd_elf32_arm_process_before_allocation (bfd *abfd,
       if (sec->reloc_count == 0)
        continue;
 
-      if ((sec->flags & SEC_EXCLUDE) != 0)
+      if ((sec->flags & SEC_EXCLUDE) != 0
+         || (sec->flags & SEC_HAS_CONTENTS) == 0)
        continue;
 
       symtab_hdr = & elf_symtab_hdr (abfd);
index e39746823f4d8ca4974a4e9a95bd1f66f6fa7749..c01355ac5b7f540a99e99fd2a20a60bed2bb480f 100644 (file)
@@ -4216,7 +4216,7 @@ avr_elf32_load_property_records (bfd *abfd)
 
   /* Find the '.avr.prop' section and load the contents into memory.  */
   sec = bfd_get_section_by_name (abfd, AVR_PROPERTY_RECORD_SECTION_NAME);
-  if (sec == NULL)
+  if (sec == NULL || (sec->flags & SEC_HAS_CONTENTS) == 0)
     return NULL;
   return avr_elf32_load_records_from_section (abfd, sec);
 }
index 833bc744563f0ec8b406a24d95637e1c0fb3009b..bb77ba2d5c7269e69f77f6d2386364d8eedd4267 100644 (file)
@@ -1087,6 +1087,7 @@ _bfd_elf_ppc_set_arch (bfd *abfd)
       s = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
       if (s != NULL
          && s->size >= 24
+         && (s->flags & SEC_HAS_CONTENTS) != 0
          && bfd_malloc_and_get_section (abfd, s, &contents))
        {
          unsigned int apuinfo_size = bfd_get_32 (abfd, contents + 4);
@@ -1840,7 +1841,8 @@ ppc_elf_get_synthetic_symtab (bfd *abfd, long symcount, asymbol **syms,
   /* If this object was prelinked, the prelinker stored the address
      of .glink at got[1].  If it wasn't prelinked, got[1] will be zero.  */
   dynamic = bfd_get_section_by_name (abfd, ".dynamic");
-  if (dynamic != NULL)
+  if (dynamic != NULL
+      && (dynamic->flags & SEC_HAS_CONTENTS) != 0)
     {
       bfd_byte *dynbuf, *extdyn, *extdynend;
       size_t extdynsize;
@@ -6106,6 +6108,7 @@ ppc_elf_relax_section (bfd *abfd,
   /* No need to do anything with non-alloc or non-code sections.  */
   if ((isec->flags & SEC_ALLOC) == 0
       || (isec->flags & SEC_CODE) == 0
+      || (isec->flags & SEC_HAS_CONTENTS) == 0
       || (isec->flags & SEC_LINKER_CREATED) != 0
       || isec->size < 4)
     return true;
index 193e00bc88ded286172252159044cc3077de939c..069bd758aec1e30b5b22c02ec504960fa8f66afc 100644 (file)
@@ -2472,7 +2472,9 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd,
       asection *dynamic, *glink = NULL, *relplt = NULL;
       arelent *p;
 
-      if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
+      if (opd != NULL
+         && ((opd->flags & SEC_HAS_CONTENTS) == 0
+             || !bfd_malloc_and_get_section (abfd, opd, &contents)))
        {
        free_contents_and_exit_err:
          count = -1;
@@ -2507,7 +2509,8 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd,
          size_t extdynsize;
          void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
 
-         if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
+         if ((dynamic->flags & SEC_HAS_CONTENTS) == 0
+             || !bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
            goto free_contents_and_exit_err;
 
          extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
@@ -5536,7 +5539,8 @@ opd_entry_value (asection *opd_sec,
 
       if (contents == NULL)
        {
-         if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
+         if ((opd_sec->flags & SEC_HAS_CONTENTS) == 0
+             || !bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
            return (bfd_vma) -1;
          ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
        }
@@ -7361,7 +7365,9 @@ ppc64_elf_edit_opd (struct bfd_link_info *info)
        continue;
 
       sec = bfd_get_section_by_name (ibfd, ".opd");
-      if (sec == NULL || sec->size == 0)
+      if (sec == NULL
+         || sec->size == 0
+         || (sec->flags & SEC_HAS_CONTENTS) == 0)
        continue;
 
       if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
@@ -8922,6 +8928,7 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
       toc = bfd_get_section_by_name (ibfd, ".toc");
       if (toc == NULL
          || toc->size == 0
+         || (toc->flags & SEC_HAS_CONTENTS) == 0
          || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
          || discarded_section (toc))
        continue;
index 5f89190a6a0bec6f40e8d0418f7bd795209b472b..ef0ebdd696702fc5e654e6e7d8f63e8687b4dee7 100644 (file)
@@ -4967,7 +4967,9 @@ elf_x86_64_get_synthetic_symtab (bfd *abfd,
   for (j = 0; plts[j].name != NULL; j++)
     {
       plt = bfd_get_section_by_name (abfd, plts[j].name);
-      if (plt == NULL || plt->size == 0)
+      if (plt == NULL
+         || plt->size == 0
+         || (plt->flags & SEC_HAS_CONTENTS) == 0)
        continue;
 
       /* Get the PLT section contents.  */
index 80e3a8d053d1b7bc94a2644cd5c4521915a027a0..bab1a36598ea8f4281e7dcf1637825099ade362e 100644 (file)
@@ -4386,7 +4386,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
                       | DYN_NO_NEEDED)) == 0;
 
       s = bfd_get_section_by_name (abfd, ".dynamic");
-      if (s != NULL && s->size != 0)
+      if (s != NULL && s->size != 0 && (s->flags & SEC_HAS_CONTENTS) != 0)
        {
          bfd_byte *dynbuf;
          bfd_byte *extdyn;
@@ -8204,7 +8204,7 @@ bfd_elf_get_bfd_needed_list (bfd *abfd,
     return true;
 
   s = bfd_get_section_by_name (abfd, ".dynamic");
-  if (s == NULL || s->size == 0)
+  if (s == NULL || s->size == 0 || (s->flags & SEC_HAS_CONTENTS) == 0)
     return true;
 
   if (!bfd_malloc_and_get_section (abfd, s, &dynbuf))
index c109ccdd996d2ed3ec53d929131400c48f083af2..bf8f913a66dee9507b98fa3fda45280f8ea91656 100644 (file)
@@ -9880,6 +9880,7 @@ get_plt_type (bfd *abfd)
   bfd_byte *contents, *extdyn, *extdynend;
   asection *sec = bfd_get_section_by_name (abfd, ".dynamic");
   if (!sec
+      || (sec->flags & SEC_HAS_CONTENTS) == 0
       || sec->size < sizeof (ElfNN_External_Dyn)
       || !bfd_malloc_and_get_section (abfd, sec, &contents))
     return ret;
index e9fb61ff9e74d377284bafdf70d7e44e8133e47c..5b66cb81c1bf52ba88e66447b5115a4cde9127f7 100644 (file)
@@ -16572,7 +16572,7 @@ _bfd_mips_elf_get_synthetic_symtab (bfd *abfd,
     return 0;
 
   plt = bfd_get_section_by_name (abfd, ".plt");
-  if (plt == NULL)
+  if (plt == NULL || (plt->flags & SEC_HAS_CONTENTS) == 0)
     return 0;
 
   slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
index 4fb7a6674f940b673d90a23e56105a70142c1a25..e57c9ee04863a99b7881c2ce1cce7fc890f53d91 100644 (file)
@@ -2880,27 +2880,38 @@ _bfd_handle_already_linked (asection *sec,
           sec->owner, sec);
       else if (sec->size != 0)
        {
-         bfd_byte *sec_contents, *l_sec_contents = NULL;
-
-         if (!bfd_malloc_and_get_section (sec->owner, sec, &sec_contents))
+         bfd_byte *sec_contents, *l_sec_contents;
+
+         if ((sec->flags & SEC_HAS_CONTENTS) == 0
+             && (l->sec->flags & SEC_HAS_CONTENTS) == 0)
+           ;
+         else if ((sec->flags & SEC_HAS_CONTENTS) == 0
+                  || !bfd_malloc_and_get_section (sec->owner, sec,
+                                                  &sec_contents))
            info->callbacks->einfo
              /* xgettext:c-format */
              (_("%pB: could not read contents of section `%pA'\n"),
               sec->owner, sec);
-         else if (!bfd_malloc_and_get_section (l->sec->owner, l->sec,
-                                               &l_sec_contents))
-           info->callbacks->einfo
-             /* xgettext:c-format */
-             (_("%pB: could not read contents of section `%pA'\n"),
-              l->sec->owner, l->sec);
-         else if (memcmp (sec_contents, l_sec_contents, sec->size) != 0)
-           info->callbacks->einfo
-             /* xgettext:c-format */
-             (_("%pB: duplicate section `%pA' has different contents\n"),
-              sec->owner, sec);
-
-         free (sec_contents);
-         free (l_sec_contents);
+         else if ((l->sec->flags & SEC_HAS_CONTENTS) == 0
+                  || !bfd_malloc_and_get_section (l->sec->owner, l->sec,
+                                                  &l_sec_contents))
+           {
+             info->callbacks->einfo
+               /* xgettext:c-format */
+               (_("%pB: could not read contents of section `%pA'\n"),
+                l->sec->owner, l->sec);
+             free (sec_contents);
+           }
+         else
+           {
+             if (memcmp (sec_contents, l_sec_contents, sec->size) != 0)
+               info->callbacks->einfo
+                 /* xgettext:c-format */
+                 (_("%pB: duplicate section `%pA' has different contents\n"),
+                  sec->owner, sec);
+             free (l_sec_contents);
+             free (sec_contents);
+           }
        }
       break;
     }
index cdf09b333faa2dd7f02147554994d7f60f628c32..abea464baa4735d4db8cd2a1503fb7afc81d0d77 100644 (file)
@@ -1201,7 +1201,7 @@ bfd_get_debug_link_info_1 (bfd *abfd, void *crc32_out)
 
   sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
 
-  if (sect == NULL)
+  if (sect == NULL || (sect->flags & SEC_HAS_CONTENTS) == 0)
     return NULL;
 
   size = bfd_section_size (sect);
@@ -1289,7 +1289,7 @@ bfd_get_alt_debug_link_info (bfd * abfd, bfd_size_type *buildid_len,
 
   sect = bfd_get_section_by_name (abfd, GNU_DEBUGALTLINK);
 
-  if (sect == NULL)
+  if (sect == NULL || (sect->flags & SEC_HAS_CONTENTS) == 0)
     return NULL;
 
   size = bfd_section_size (sect);
@@ -1801,7 +1801,8 @@ get_build_id (bfd *abfd)
     return (struct bfd_build_id *) abfd->build_id;
 
   sect = bfd_get_section_by_name (abfd, ".note.gnu.build-id");
-  if (sect == NULL)
+  if (sect == NULL
+      || (sect->flags & SEC_HAS_CONTENTS) == 0)
     {
       bfd_set_error (bfd_error_no_debug_section);
       return NULL;
index fa2b4296e86705296aaeb1149c2d028a3eca2b88..43f3a83743c64b52f16b14d958233004b63c2d68 100644 (file)
@@ -1288,7 +1288,7 @@ pe_print_idata (bfd * abfd, void * vfile)
     {
       /* Maybe the extra header isn't there.  Look for the section.  */
       section = bfd_get_section_by_name (abfd, ".idata");
-      if (section == NULL)
+      if (section == NULL || (section->flags & SEC_HAS_CONTENTS) == 0)
        return true;
 
       addr = section->vma;
@@ -1845,6 +1845,7 @@ pe_print_pdata (bfd * abfd, void * vfile)
   int onaline = PDATA_ROW_SIZE;
 
   if (section == NULL
+      || (section->flags & SEC_HAS_CONTENTS) == 0
       || coff_section_data (abfd, section) == NULL
       || pei_section_data (abfd, section) == NULL)
     return true;
@@ -2014,6 +2015,7 @@ _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile)
   struct sym_cache cache = {0, 0} ;
 
   if (section == NULL
+      || (section->flags & SEC_HAS_CONTENTS) == 0
       || coff_section_data (abfd, section) == NULL
       || pei_section_data (abfd, section) == NULL)
     return true;
@@ -2147,7 +2149,9 @@ pe_print_reloc (bfd * abfd, void * vfile)
   asection *section = bfd_get_section_by_name (abfd, ".reloc");
   bfd_byte *p, *end;
 
-  if (section == NULL || section->size == 0 || !(section->flags & SEC_HAS_CONTENTS))
+  if (section == NULL
+      || section->size == 0
+      || (section->flags & SEC_HAS_CONTENTS) == 0)
     return true;
 
   fprintf (file,
index c33d422a4491eefb841f4ef694a395b7669151c1..4d2ba71def922239bbdb6d485886c098f962966c 100644 (file)
@@ -555,6 +555,7 @@ pex64_bfd_print_pdata_section (bfd *abfd, void *vfile, asection *pdata_section)
 
   /* Sanity checks.  */
   if (pdata_section == NULL
+      || (pdata_section->flags & SEC_HAS_CONTENTS) == 0
       || coff_section_data (abfd, pdata_section) == NULL
       || pei_section_data (abfd, pdata_section) == NULL)
     return true;
@@ -699,6 +700,7 @@ pex64_bfd_print_pdata_section (bfd *abfd, void *vfile, asection *pdata_section)
     xdata_section = pex64_get_section_by_rva (abfd, xdata_base, ".text");
   /* Transfer xdata section into xdata array.  */
   if (!xdata_section
+      || (xdata_section->flags & SEC_HAS_CONTENTS) == 0
       || !bfd_malloc_and_get_section (abfd, xdata_section, &xdata))
     goto done;
 
index da0c61d6c2a8bd863ce438cadcfad41a4486ddaf..1cce2ae4f3fc17cbd6abaf6ef3990a62b969f3f4 100644 (file)
@@ -162,7 +162,9 @@ _bfd_link_section_stabs (bfd *abfd,
   bfd_size_type *pstridx;
 
   if (stabsec->size == 0
-      || stabstrsec->size == 0)
+      || stabstrsec->size == 0
+      || (stabsec->flags & SEC_HAS_CONTENTS) == 0
+      || (stabstrsec->flags & SEC_HAS_CONTENTS) == 0)
     /* This file does not contain stabs debugging information.  */
     return true;
 
@@ -520,7 +522,7 @@ _bfd_discard_section_stabs (bfd *abfd,
   bfd_size_type *pstridx;
   int deleting;
 
-  if (stabsec->size == 0)
+  if (stabsec->size == 0 || (stabsec->flags & SEC_HAS_CONTENTS) == 0)
     /* This file does not contain stabs debugging information.  */
     return false;
 
index b3ab78013adf3ca643b9cc401e8d7e51cbdc54eb..a67f24ba847000ff8cc66ccf9e23ef0061e4ba7b 100644 (file)
@@ -259,7 +259,7 @@ _bfd_xcoff_get_dynamic_symtab_upper_bound (bfd *abfd)
     }
 
   lsec = bfd_get_section_by_name (abfd, ".loader");
-  if (lsec == NULL)
+  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
     {
       bfd_set_error (bfd_error_no_symbols);
       return -1;
@@ -293,7 +293,7 @@ _bfd_xcoff_canonicalize_dynamic_symtab (bfd *abfd, asymbol **psyms)
     }
 
   lsec = bfd_get_section_by_name (abfd, ".loader");
-  if (lsec == NULL)
+  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
     {
       bfd_set_error (bfd_error_no_symbols);
       return -1;
@@ -378,7 +378,7 @@ _bfd_xcoff_get_dynamic_reloc_upper_bound (bfd *abfd)
     }
 
   lsec = bfd_get_section_by_name (abfd, ".loader");
-  if (lsec == NULL)
+  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
     {
       bfd_set_error (bfd_error_no_symbols);
       return -1;
@@ -413,7 +413,7 @@ _bfd_xcoff_canonicalize_dynamic_reloc (bfd *abfd,
     }
 
   lsec = bfd_get_section_by_name (abfd, ".loader");
-  if (lsec == NULL)
+  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
     {
       bfd_set_error (bfd_error_no_symbols);
       return -1;
@@ -904,7 +904,7 @@ xcoff_link_add_dynamic_symbols (bfd *abfd, struct bfd_link_info *info)
      o_snloader field in the a.out header, rather than grabbing the
      section by name.  */
   lsec = bfd_get_section_by_name (abfd, ".loader");
-  if (lsec == NULL)
+  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
     {
       _bfd_error_handler
        (_("%pB: dynamic object with no .loader section"),
@@ -2373,7 +2373,7 @@ xcoff_link_check_dynamic_ar_symbols (bfd *abfd,
   *pneeded = false;
 
   lsec = bfd_get_section_by_name (abfd, ".loader");
-  if (lsec == NULL)
+  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
     /* There are no symbols, so don't try to include it.  */
     return true;
 
@@ -4128,7 +4128,9 @@ bfd_xcoff_build_dynamic_sections (bfd *output_bfd,
        {
          /* Grab the contents of SUB's .debug section, if any.  */
          subdeb = bfd_get_section_by_name (sub, ".debug");
-         if (subdeb != NULL && subdeb->size > 0)
+         if (subdeb != NULL
+             && subdeb->size != 0
+             && (subdeb->flags & SEC_HAS_CONTENTS) != 0)
            {
              /* We use malloc and copy the names into the debug
                 stringtab, rather than bfd_alloc, because I expect