* config/tc-arm.c (arm_fix_adjustable): For COFF, convert fixups against
authorNick Clifton <nickc@redhat.com>
Tue, 9 May 2006 11:47:48 +0000 (11:47 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 9 May 2006 11:47:48 +0000 (11:47 +0000)
   symbols which are not going to be placed into the symbol table.
* coffcode.h (coff_write_relocs): Produce an error message if a an
   out-of-range symbol index is detected in a reloc.

bfd/ChangeLog
bfd/coffcode.h
gas/ChangeLog
gas/config/tc-arm.c

index cf6d0300c4278c068c8b7e6fcac560331a06541b..3c8c5054a3bd79767ada1cb99c5bd4019d8aaf94 100644 (file)
@@ -1,3 +1,8 @@
+2006-05-09  Nick Clifton  <nickc@redhat.com>
+
+       * coffcode.h (coff_write_relocs): Produce an error message if a an
+       out-of-range symbol index is detected in a reloc.
+
 2006-05-09  Ben Elliston  <bje@au.ibm.com>
 
        * elf64-ppc.c (ppc64_elf_finish_dynamic_symbol): Remove unused
index 6eae4a35d7363173f5a7da00e744367f88b74a13..badb2144705b7150263faf537be6f79ea1579ed2 100644 (file)
@@ -2532,11 +2532,15 @@ coff_write_relocs (bfd * abfd, int first_undef)
                else
                  {
                    n.r_symndx = get_index ((*(q->sym_ptr_ptr)));
-                   /* Take notice if the symbol reloc points to a symbol
-                      we don't have in our symbol table.  What should we
-                      do for this??  */
+                   /* Check to see if the symbol reloc points to a symbol
+                      we don't have in our symbol table.  */
                    if (n.r_symndx > obj_conv_table_size (abfd))
-                     abort ();
+                     {
+                       bfd_set_error (bfd_error_bad_value);
+                       _bfd_error_handler (_("%B: reloc against a non-existant symbol index: %ld"),
+                                           abfd, n.r_symndx);
+                       return FALSE;
+                     }
                  }
              }
 
index c099fb015974f92d3b63599ad92809fd827ddce7..b72aa5b450f58c24195ed0e5172f771bae92e8f3 100644 (file)
@@ -1,3 +1,9 @@
+2006-05-09  Nick Clifton  <nickc@redhat.com>
+
+       * config/tc-arm.c (arm_fix_adjustable): For COFF, convert fixups
+       against symbols which are not going to be placed into the symbol
+       table.
+
 2006-05-09  Ben Elliston  <bje@au.ibm.com>
 
        * expr.c (operand): Remove `if (0 && ..)' statement and
index 47f39a8f409df182a7b2b3044745affa5554cdbf..fe24ab277aeb08381bb011f34163df6adf1c53be 100644 (file)
@@ -17003,17 +17003,35 @@ arm_force_relocation (struct fix * fixp)
 }
 
 #ifdef OBJ_COFF
-/* This is a little hack to help the gas/arm/adrl.s test.  It prevents
-   local labels from being added to the output symbol table when they
-   are used with the ADRL pseudo op.  The ADRL relocation should always
-   be resolved before the binbary is emitted, so it is safe to say that
-   it is adjustable.  */
-
 bfd_boolean
 arm_fix_adjustable (fixS * fixP)
 {
+  /* This is a little hack to help the gas/arm/adrl.s test.  It prevents
+     local labels from being added to the output symbol table when they
+     are used with the ADRL pseudo op.  The ADRL relocation should always
+     be resolved before the binbary is emitted, so it is safe to say that
+     it is adjustable.  */
   if (fixP->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE)
     return 1;
+
+  /* This is a hack for the gas/all/redef2.s test.  This test causes symbols
+     to be cloned, and without this test relocs would still be generated
+     against the original pre-cloned symbol.  Such symbols would not appear
+     in the symbol table however, and so a valid reloc could not be
+     generated.  So check to see if the fixup is against a symbol which has
+     been removed from the symbol chain, and if it is, then allow it to be
+     adjusted into a reloc against a section symbol. */
+  if (fixP->fx_addsy != NULL)
+    {
+      symbolS * sym;
+
+      for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
+       if (sym == fixP->fx_addsy)
+         break;
+      if (sym == NULL)
+       return 1;
+    }
+  
   return 0;
 }
 #endif