* elf64-mmix.c (_bfd_mmix_finalize_linker_allocated_gregs): Check
authorHans-Peter Nilsson <hp@axis.com>
Sat, 9 Feb 2002 05:04:27 +0000 (05:04 +0000)
committerHans-Peter Nilsson <hp@axis.com>
Sat, 9 Feb 2002 05:04:27 +0000 (05:04 +0000)
that base-plus-offset reloc accounting is consistent.
(mmix_elf_relax_section): Keep base-plus-offset reloc accounting
up to date for undefined symbols.

bfd/ChangeLog
bfd/elf64-mmix.c

index 750fea195a158ebded6cd9fbde88292a94c421fa..bf5854df4e4c1a73ca4353cbdac3f885e477bbd3 100644 (file)
@@ -1,3 +1,10 @@
+2002-02-09  Hans-Peter Nilsson  <hp@bitrange.com>
+
+       * elf64-mmix.c (_bfd_mmix_finalize_linker_allocated_gregs): Check
+       that base-plus-offset reloc accounting is consistent.
+       (mmix_elf_relax_section): Keep base-plus-offset reloc accounting
+       up to date for undefined symbols.
+
 2002-02-08  Eric Christopher  <echristo@redhat.com>
 
        From Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
index c547c4b55c85881266b8f427c0b9495e0be5d93c..3bda435c987cc9727fc94752bfaf1a6531d9c924 100644 (file)
@@ -2177,6 +2177,21 @@ _bfd_mmix_finalize_linker_allocated_gregs (abfd, link_info)
   if (contents == NULL)
     return false;
 
+  /* Sanity check: If these numbers mismatch, some relocation has not been
+     accounted for and the rest of gregdata is probably inconsistent.
+     It's a bug, but it's more helpful to identify it than segfaulting
+     below.  */
+  if (gregdata->n_remaining_bpo_relocs_this_relaxation_round
+      != gregdata->n_bpo_relocs)
+    {
+      (*_bfd_error_handler)
+       (_("Internal inconsistency: remaining %u != max %u.\n\
+  Please report this bug."),
+        gregdata->n_remaining_bpo_relocs_this_relaxation_round,
+        gregdata->n_bpo_relocs);
+      return false;
+    }
+
   for (lastreg = 255, i = 0, j = 0; j < n_gregs; i++)
     if (gregdata->reloc_request[i].regindex != lastreg)
       {
@@ -2287,7 +2302,6 @@ mmix_elf_relax_section (abfd, sec, link_info, again)
      struct bfd_link_info *link_info;
      boolean *again;
 {
-
   Elf_Internal_Shdr *symtab_hdr;
   Elf_Internal_Shdr *shndx_hdr;
   Elf_Internal_Rela *internal_relocs;
@@ -2431,9 +2445,12 @@ mmix_elf_relax_section (abfd, sec, link_info, again)
          if (h->root.type != bfd_link_hash_defined
              && h->root.type != bfd_link_hash_defweak)
            {
-             /* This appears to be a reference to an undefined
-                 symbol.  Just ignore it--it will be caught by the
-                 regular reloc processing.  */
+             /* This appears to be a reference to an undefined symbol.
+                Just ignore it--it will be caught by the regular reloc
+                processing.  We need to keep BPO reloc accounting
+                consistent, though.  */
+             gregdata->n_remaining_bpo_relocs_this_relaxation_round--;
+             bpono++;
              continue;
            }