* elf32-i386.c (elf_i386_relocate_section <R_386_GOT32>): Tighten
authorAlan Modra <amodra@gmail.com>
Sat, 23 Jun 2001 15:02:43 +0000 (15:02 +0000)
committerAlan Modra <amodra@gmail.com>
Sat, 23 Jun 2001 15:02:43 +0000 (15:02 +0000)
unresolved_reloc test to exclude cases where we use "relocation"
before setting it to point into the .got.  Reinstate fudge for
unresolved relocs in debugging sections.

bfd/ChangeLog
bfd/elf32-i386.c

index cabe67e5506c2ed0b07e299a1751d60c4a9215f6..525acc484799199b2323196aafd5f465afafdcc3 100644 (file)
@@ -1,5 +1,10 @@
 2001-06-23  Alan Modra  <amodra@bigpond.net.au>
 
+       * elf32-i386.c (elf_i386_relocate_section <R_386_GOT32>): Tighten
+       unresolved_reloc test to exclude cases where we use "relocation"
+       before setting it to point into the .got.  Reinstate fudge for
+       unresolved relocs in debugging sections.
+
        * elf32-i386.c (elf_i386_relocate_section): Replace ugly
        complicated tests for unresolvable relocs with a simple direct
        scheme using "unresolved_reloc" var.
index ababa025e21d275ede626d52569d40b24e7d5583..a628e0c7149514317307779f85569daa19564134 100644 (file)
@@ -1586,6 +1586,8 @@ elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
                      h->got.offset |= 1;
                    }
                }
+             else
+               unresolved_reloc = false;
            }
          else
            {
@@ -1632,7 +1634,6 @@ elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
            abort ();
 
          relocation = htab->sgot->output_offset + off;
-         unresolved_reloc = false;
          break;
 
        case R_386_GOTOFF:
@@ -1810,7 +1811,15 @@ elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
          break;
        }
 
-      if (unresolved_reloc)
+      /* FIXME: Why do we allow debugging sections to escape this error?
+        More importantly, why do we not emit dynamic relocs for
+        R_386_32 above in debugging sections (which are ! SEC_ALLOC)?
+        If we had emitted the dynamic reloc, we could remove the
+        fudge here.  */
+      if (unresolved_reloc
+         && !(info->shared
+              && (input_section->flags & SEC_DEBUGGING) != 0
+              && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
        (*_bfd_error_handler)
          (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
           bfd_get_filename (input_bfd),