do not adjust relocations against thumb function names as the linker needs
authorNick Clifton <nickc@redhat.com>
Thu, 20 Aug 1998 21:47:17 +0000 (21:47 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 20 Aug 1998 21:47:17 +0000 (21:47 +0000)
this information.

gas/ChangeLog
gas/config/tc-arm.c

index 0d3f2e5..2451724 100644 (file)
@@ -1,3 +1,9 @@
+start-sanitize-armelf
+Thu Aug 20 14:45:08 1998  Nick Clifton  <nickc@cygnus.com>
+
+       * config/tc-arm.c (arm_fix_adjustable): Do not adjust relocations
+       against Thumb function names, as the linker needs this information.
+end-sanitize-armelf
 1998-08-20  Vladimir N. Makarov  <vmakarov@cygnus.com>
 
        * expr.c (operand): Check also that there is no advance in operand
index 8739c26..f1bc1fc 100644 (file)
@@ -6407,12 +6407,34 @@ arm_canonicalize_symbol_name (name)
   return name;
 }
 /* start-sanitize-armelf */
+#ifdef OBJ_ELF
+/* Relocations against Thumb function names must be left unadjusted,
+   so that the linker can use this information to correctly set the
+   bottom bit of their addresses.  The MIPS version of this function
+   also prevents relocations that are mips-16 specific, but I do not
+   know why it does this.
+
+   FIXME:
+   There is one other problem that ought to be addressed here, but
+   which currently is not:  Taking the address of a label (rather
+   than a function) and then later jumping to that address.  Such
+   address also ought to have their bottom bit set (assuming that
+   they reside in Thumb code), but at the moment they will not.  */
+   
 boolean
-arm_fix_adjustable(fixP)
-  fixS *fixP;
+arm_fix_adjustable (fixP)
+   fixS *fixP;
 {
+  if (fixP->fx_addsy == NULL)
+    return 1;
+  
+  if (THUMB_IS_FUNC (fixP->fx_addsy)
+      && fixP->fx_subsy == NULL)
+    return 0;
+  
   return 1;
 }
+#endif /* OBJ_ELF */
 /* end-sanitize-armelf */
 
 boolean