aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-arm.c
diff options
context:
space:
mode:
Diffstat (limited to 'gas/config/tc-arm.c')
-rw-r--r--gas/config/tc-arm.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 8739c26..f1bc1fc 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -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