+2011-05-31  Paul Brook  <paul@codesourcery.com>
+       Nathan Sidwell  <nathan@codesourcery.com>
+
+       * config/tc-arm.c (fix_new_arm): Create an absolute symbol for
+       pc-relative fixes to constants.
+       * config/tc-arm.h (TC_FORCE_RELOCATATION_ABS): Define.
+       
 2011-05-27  Nick Clifton  <nickc@redhat.com>
 
        * config/tc-s390.c (md_begin): Remove unused variable dup_insn.
 
   switch (exp->X_op)
     {
     case O_constant:
+      if (pc_rel)
+       {
+         /* Create an absolute valued symbol, so we have something to
+             refer to in the object file.  Unfortunately for us, gas's
+             generic expression parsing will already have folded out
+             any use of .set foo/.type foo %function that may have
+             been used to set type information of the target location,
+             that's being specified symbolically.  We have to presume
+             the user knows what they are doing.  */
+         char name[16 + 8];
+         symbolS *symbol;
+
+         sprintf (name, "*ABS*0x%lx", (unsigned long)exp->X_add_number);
+
+         symbol = symbol_find_or_make (name);
+         S_SET_SEGMENT (symbol, absolute_section);
+         symbol_set_frag (symbol, &zero_address_frag);
+         S_SET_VALUE (symbol, exp->X_add_number);
+         exp->X_op = O_symbol;
+         exp->X_add_symbol = symbol;
+         exp->X_add_number = 0;
+       }
+      /* FALLTHROUGH */
     case O_symbol:
     case O_add:
     case O_subtract:
 
   (THUMB_IS_FUNC ((FIX)->fx_addsy)             \
    || !SEG_NORMAL (SEG))
 
+#define TC_FORCE_RELOCATION_ABS(FIX)                   \
+  (((FIX)->fx_pcrel                                    \
+    && (FIX)->fx_r_type != BFD_RELOC_32                        \
+    && (FIX)->fx_r_type != BFD_RELOC_ARM_GOT32)                \
+   || TC_FORCE_RELOCATION(FIX))
+
 #define TC_CONS_FIX_NEW cons_fix_new_arm
 
 #define MAX_MEM_ALIGNMENT_BYTES    6
 
+2011-05-31  Paul Brook  <paul@codesourcery.com>
+       Nathan Sidwell  <nathan@codesourcery.com>
+
+       * ld-arm/abs-call-1.d: New.
+       * ld-arm/abs-call-1.s: New.
+       * ld-arm/arm-elf.exp: Add it.
+
 2011-05-31  Paul Brook  <paul@codesourcery.com>
 
        * ld-arm/tls-longplt.d: Update expected output.
 
--- /dev/null
+.*:     file format elf32-.*
+
+
+Disassembly of section .text:
+
+00008000 <arm>:
+    8000:      eb03dffe        bl      100000 <foo>
+    8004:      ea03dffd        b       100000 <foo>
+    8008:      eb03dffc        bl      100000 <foo>
 
--- /dev/null
+
+       .type foo, %function
+       .set foo, 0x100000
+
+arm:   bl      0x100000
+       b       0x100000
+       bl      foo
+
 
       {objdump {-s -j.data -j.got} ifunc-16.gd}
       {readelf -r ifunc-16.rd}}
      "ifunc-16"}
+    {"abs call" "-T arm.ld" "" {abs-call-1.s}
+     {{objdump -d abs-call-1.d}}
+     "abs-call-1"}
 }
 
 run_ld_link_tests $armelftests