2005-12-13 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 13 Dec 2005 15:34:28 +0000 (15:34 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 13 Dec 2005 15:34:28 +0000 (15:34 +0000)
PR ld/2008
* elf.c (_bfd_elf_setup_sections): Return FALSE if
elf_linked_to_section will be set to NULL.

* format.c (bfd_check_format_matches): Don't check the default
target twice.

bfd/ChangeLog
bfd/elf.c
bfd/format.c

index f7ed00a..1cddc78 100644 (file)
@@ -1,3 +1,12 @@
+2005-12-13  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/2008
+       * elf.c (_bfd_elf_setup_sections): Return FALSE if
+       elf_linked_to_section will be set to NULL.
+
+       * format.c (bfd_check_format_matches): Don't check the default
+       target twice.
+
 2005-12-13  Alan Modra  <amodra@bigpond.net.au>
 
        * elf64-ppc.c (ppc64_elf_relocate_section): Force tail calls in
index 58a9059..019f72a 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -654,8 +654,23 @@ _bfd_elf_setup_sections (bfd *abfd)
            }
          else
            {
+             asection *link;
+
              this_hdr = elf_elfsections (abfd)[elfsec];
-             elf_linked_to_section (s) = this_hdr->bfd_section;
+
+             /* PR 1991, 2008:
+                Some strip/objcopy may leave an incorrect value in
+                sh_link.  We don't want to proceed.  */
+             link = this_hdr->bfd_section;
+             if (link == NULL)
+               {
+                 (*_bfd_error_handler)
+                   (_("%B: sh_link [%d] in section `%A' is incorrect"),
+                    s->owner, s, elfsec);
+                 result = FALSE;
+               }
+
+             elf_linked_to_section (s) = link;
            }
        }
     }
index ba9ca9f..6a34dd2 100644 (file)
@@ -217,7 +217,9 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
       const bfd_target *temp;
       bfd_error_type err;
 
-      if (*target == &binary_vec)
+      /* Don't check the default target twice.  */
+      if (*target == &binary_vec
+         || (!abfd->target_defaulted && *target == save_targ))
        continue;
 
       abfd->xvec = *target;    /* Change BFD's target temporarily.  */