* elf32-mips.c (mips16_jump_reloc): Remove function.
	(elf_mips16_howto_table_rel): Use _bfd_mips_elf_generic_reloc
	instead of mips16_jump_reloc.
	* elf64_mips.c, wlfn32-mips.c (mips16_jump_reloc): Remove function.
	(elf_mips16_howto_table_rel, elf_mips16_howto_table_rela): Use
	_bfd_mips_elf_generic_reloc instead of mips16_jump_reloc.
	[ gas/ChangeLog ]
	* config/tc-mips.c (mips_fix_adjustable): Handle BFD_RELOC_MIPS16_JMP.
	(tc_gen_reloc): Handle mips16 jumps to section symbol offsets.
	[ ld/testsuite/ChangeLog ]
	* ld-mips-elf/mips16-call-global-1.s,
	ld-mips-elf/mips16-call-global-2.s,
	ld-mips-elf/mips16-call-global-3.s, ld-mips-elf/mips16-call-global.d:
	Test linking of external mips16 jumps.
	* ld-mips-elf/mips-elf.exp: Run new test.
+2006-07-20  Thiemo Seufer  <ths@mips.com>
+
+       * elf32-mips.c (mips16_jump_reloc): Remove function.
+       (elf_mips16_howto_table_rel): Use _bfd_mips_elf_generic_reloc
+       instead of mips16_jump_reloc.
+       * elf64_mips.c, wlfn32-mips.c (mips16_jump_reloc): Remove function.
+       (elf_mips16_howto_table_rel, elf_mips16_howto_table_rela): Use
+       _bfd_mips_elf_generic_reloc instead of mips16_jump_reloc.
+
 2006-07-19  Alan Modra  <amodra@bigpond.net.au>
 
        * bfd-in.h (enum notice_asneeded_action): Define.
 
   (bfd *);
 static bfd_boolean mips_elf_is_local_label_name
   (bfd *, const char *);
-static bfd_reloc_status_type mips16_jump_reloc
-  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
 static bfd_reloc_status_type mips16_gprel_reloc
   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
 static bfd_reloc_status_type mips_elf_final_gp
                                /* This needs complex overflow
                                   detection, because the upper four
                                   bits must match the PC.  */
-        mips16_jump_reloc,     /* special_function */
+        _bfd_mips_elf_generic_reloc, /* special_function */
         "R_MIPS16_26",         /* name */
         TRUE,                  /* partial_inplace */
         0x3ffffff,             /* src_mask */
   return r;
 }
 
-/* Handle a mips16 jump.  */
-
-static bfd_reloc_status_type
-mips16_jump_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
-                  asymbol *symbol, void *data ATTRIBUTE_UNUSED,
-                  asection *input_section, bfd *output_bfd,
-                  char **error_message ATTRIBUTE_UNUSED)
-{
-  if (output_bfd != NULL
-      && (symbol->flags & BSF_SECTION_SYM) == 0
-      && reloc_entry->addend == 0)
-    {
-      reloc_entry->address += input_section->output_offset;
-      return bfd_reloc_ok;
-    }
-
-  /* FIXME.  */
-  {
-    static bfd_boolean warned;
-
-    if (! warned)
-      (*_bfd_error_handler)
-       (_("Linking mips16 objects into %s format is not supported"),
-        bfd_get_target (input_section->output_section->owner));
-    warned = TRUE;
-  }
-
-  return bfd_reloc_undefined;
-}
-
 /* Handle a mips16 GP relative reloc.  */
 
 static bfd_reloc_status_type
 
   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
 static bfd_reloc_status_type mips_elf64_shift6_reloc
   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
-static bfd_reloc_status_type mips16_jump_reloc
-  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
 static bfd_reloc_status_type mips16_gprel_reloc
   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
 static bfd_boolean mips_elf64_assign_gp
                                /* This needs complex overflow
                                   detection, because the upper four
                                   bits must match the PC.  */
-        mips16_jump_reloc,     /* special_function */
+        _bfd_mips_elf_generic_reloc, /* special_function */
         "R_MIPS16_26",         /* name */
         TRUE,                  /* partial_inplace */
         0x3ffffff,             /* src_mask */
                                /* This needs complex overflow
                                   detection, because the upper four
                                   bits must match the PC.  */
-        mips16_jump_reloc,     /* special_function */
+        _bfd_mips_elf_generic_reloc, /* special_function */
         "R_MIPS16_26",         /* name */
         FALSE,                 /* partial_inplace */
         0x3ffffff,             /* src_mask */
                                      error_message);
 }
 
-/* Handle a mips16 jump.  */
-
-static bfd_reloc_status_type
-mips16_jump_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
-                  asymbol *symbol, void *data ATTRIBUTE_UNUSED,
-                  asection *input_section, bfd *output_bfd,
-                  char **error_message ATTRIBUTE_UNUSED)
-{
-  if (output_bfd != NULL
-      && (symbol->flags & BSF_SECTION_SYM) == 0
-      && (! reloc_entry->howto->partial_inplace
-         || reloc_entry->addend == 0))
-    {
-      reloc_entry->address += input_section->output_offset;
-      return bfd_reloc_ok;
-    }
-
-  /* FIXME.  */
-  {
-    static bfd_boolean warned;
-
-    if (! warned)
-      (*_bfd_error_handler)
-       (_("Linking mips16 objects into %s format is not supported"),
-        bfd_get_target (input_section->output_section->owner));
-    warned = TRUE;
-  }
-
-  return bfd_reloc_undefined;
-}
-
 /* Handle a mips16 GP relative reloc.  */
 
 static bfd_reloc_status_type
 
   (bfd *, asymbol *, arelent *, asection *, bfd_boolean, void *, bfd_vma);
 static bfd_reloc_status_type mips_elf_shift6_reloc
   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
-static bfd_reloc_status_type mips16_jump_reloc
-  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
 static bfd_reloc_status_type mips16_gprel_reloc
   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
                                /* This needs complex overflow
                                   detection, because the upper four
                                   bits must match the PC.  */
-        mips16_jump_reloc,     /* special_function */
+        _bfd_mips_elf_generic_reloc, /* special_function */
         "R_MIPS16_26",         /* name */
         TRUE,                  /* partial_inplace */
         0x3ffffff,             /* src_mask */
                                /* This needs complex overflow
                                   detection, because the upper four
                                   bits must match the PC.  */
-        mips16_jump_reloc,     /* special_function */
+        _bfd_mips_elf_generic_reloc, /* special_function */
         "R_MIPS16_26",         /* name */
         FALSE,                 /* partial_inplace */
         0x3ffffff,             /* src_mask */
                                      error_message);
 }
 \f
-/* Handle a mips16 jump.  */
-
-static bfd_reloc_status_type
-mips16_jump_reloc (bfd *abfd ATTRIBUTE_UNUSED,
-                  arelent *reloc_entry ATTRIBUTE_UNUSED,
-                  asymbol *symbol ATTRIBUTE_UNUSED,
-                  void *data ATTRIBUTE_UNUSED,
-                  asection *input_section, bfd *output_bfd ATTRIBUTE_UNUSED,
-                  char **error_message ATTRIBUTE_UNUSED)
-{
-  static bfd_boolean warned = FALSE;
-
-  /* FIXME.  */
-  if (! warned)
-    (*_bfd_error_handler)
-      (_("Linking mips16 objects into %s format is not supported"),
-       bfd_get_target (input_section->output_section->owner));
-  warned = TRUE;
-
-  return bfd_reloc_undefined;
-}
-
 /* Handle a mips16 GP relative reloc.  */
 
 static bfd_reloc_status_type
 
+2006-07-20  Thiemo Seufer  <ths@mips.com>
+
+       * config/tc-mips.c (mips_fix_adjustable): Handle BFD_RELOC_MIPS16_JMP.
+       (tc_gen_reloc): Handle mips16 jumps to section symbol offsets.
+
 2006-07-19  Paul Brook  <paul@codesourcery.com>
 
        * config/tc-arm.c (insns): Fix rbit Arm opcode.
 
 int
 mips_fix_adjustable (fixS *fixp)
 {
-  /* Don't adjust MIPS16 jump relocations, so we don't have to worry
-     about the format of the offset in the .o file. */
-  if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP)
-    return 0;
-
   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
     return 0;
   else
     reloc->addend = fixp->fx_addnumber;
 
+  /* Handle relocs adjusted against a section symbol.  */
+  if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP)
+    reloc->addend += fixp->fx_offset;
+
   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
      entry to be used in the relocation's section offset.  */
   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
 
+2006-07-20  Thiemo Seufer  <ths@mips.com>
+
+       * ld-mips-elf/mips16-call-global-1.s,
+       ld-mips-elf/mips16-call-global-2.s,
+       ld-mips-elf/mips16-call-global-3.s, ld-mips-elf/mips16-call-global.d:
+       Test linking of external mips16 jumps.
+       * ld-mips-elf/mips-elf.exp: Run new test.
+
 2006-07-19  Thiemo Seufer  <ths@mips.com>
 
        * ld-selective/selective.exp: Fix selective testcases for MIPS.
 
     run_ld_link_tests $mips_tls_tests
 }
 
+set mips16_call_global_test {
+    {"Global calls from mips16"
+     ""
+     "-mips32r2" {mips16-call-global-1.s mips16-call-global-2.s mips16-call-global-3.s}
+     {{objdump -dr mips16-call-global.d}}
+     "mips16-call-global"}
+}
+
+run_ld_link_tests $mips16_call_global_test
 
--- /dev/null
+       .set    mips16
+
+       .globl  __start
+       .ent    __start
+__start:
+       .frame  $sp,24,$31
+       save    24,$31
+       jal     x+8
+       jal     y+8
+       restore 24,$31
+       j       $31
+       .end    __start
 
--- /dev/null
+       .set mips16
+
+       .globl  x
+       .ent    x
+       .type   x,@function
+x:
+       jr      $31
+       .end    x
 
--- /dev/null
+       .globl  y
+       .ent    y
+       .type   y,@function
+y:
+       jr      $31
+       .end    y
 
--- /dev/null
+#as: -mips32r2
+#source: mips16-call-global-1.S mips16-call-global-2.S mips16-call-global-3.S
+
+.*:     file format elf.*mips
+
+Disassembly of section .text:
+
+00400090 <__start>:
+  400090:      64c3            save    24,ra
+  400092:      1a00 002e       jal     4000b8 <x\+0x8>
+  400096:      6500            nop
+  400098:      1e00 0032       jalx    4000c8 <y\+0x8>
+  40009c:      6500            nop
+  40009e:      6443            restore 24,ra
+  4000a0:      e8a0            jrc     ra
+  4000a2:      6500            nop
+  4000a4:      6500            nop
+  4000a6:      6500            nop
+  4000a8:      6500            nop
+  4000aa:      6500            nop
+  4000ac:      6500            nop
+  4000ae:      6500            nop
+
+004000b0 <x>:
+  4000b0:      e8a0            jrc     ra
+  4000b2:      6500            nop
+  4000b4:      6500            nop
+  4000b6:      6500            nop
+  4000b8:      6500            nop
+  4000ba:      6500            nop
+  4000bc:      6500            nop
+  4000be:      6500            nop
+
+004000c0 <y>:
+  4000c0:      03e00008        jr      ra
+  4000c4:      00000000        nop
+       \.\.\.