2005-05-18 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 18 May 2005 13:41:59 +0000 (13:41 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 18 May 2005 13:41:59 +0000 (13:41 +0000)
* elf.c (group_signature): Check if the symbol table section is
correct.

bfd/ChangeLog
bfd/elf.c

index 76f3f264e7cc55c2e3d114b63c142fd4d50a2eb5..9452a3561fb51685699efcd21bc3f487b2429313 100644 (file)
@@ -1,3 +1,8 @@
+2005-05-18  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elf.c (group_signature): Undo the last change. Check if the
+       symbol table section is correct.
+
 2005-05-17  Zack Weinberg  <zack@codesourcery.com>
 
        * elf32-arm.c: Wherever possible, use official reloc names
index 3ef04d4e2cc55558d4839cdd9f6ee51592c805e8..2f610ba7ea85832581c6a00c474246797cfc88d1 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -451,24 +451,12 @@ group_signature (bfd *abfd, Elf_Internal_Shdr *ghdr)
   unsigned char esym[sizeof (Elf64_External_Sym)];
   Elf_External_Sym_Shndx eshndx;
   Elf_Internal_Sym isym;
-  unsigned int i;
-
-  if (ghdr == NULL)
-    return NULL;
-
-  /* If this section is linked to by other sections then it is a symbol or
-     string section which is masquerading as a group.  This is a bad thing,
-     and if we carry on to the call to bfd_section_from_shdr below we will
-     enter an infinite loop.  So check now and break out if we detect this
-     case.  See:    
-     http://sources.redhat.com/ml/binutils/2005-05/msg00421.html
-     for a report of a case that tirggers this code.  */
-  for (i = elf_numsections (abfd); i--;)
-    if (elf_elfsections (abfd) [elf_elfsections (abfd) [i]->sh_link] == ghdr)
-      return NULL;
 
-  /* Next we need to ensure the symbol table is available.  */
-  if (! bfd_section_from_shdr (abfd, ghdr->sh_link))
+  /* First we need to ensure the symbol table is available.  Make sure
+     that it is a symbol table section.  */
+  hdr = elf_elfsections (abfd) [ghdr->sh_link];
+  if (hdr->sh_type != SHT_SYMTAB
+      || ! bfd_section_from_shdr (abfd, ghdr->sh_link))
     return NULL;
 
   /* Go read the symbol.  */