--- /dev/null
+--- binutils/gas/config/tc-mips.c.orig 2004-12-20 12:16:50.000000000 -0700
++++ binutils/gas/config/tc-mips.c 2005-03-02 03:42:08.000000000 -0700
+@@ -10955,8 +10955,6 @@
+
+ buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
+
+- assert (! fixP->fx_pcrel);
+-
+ /* Don't treat parts of a composite relocation as done. There are two
+ reasons for this:
+
+@@ -11000,7 +10998,6 @@
+ case BFD_RELOC_MIPS_CALL_HI16:
+ case BFD_RELOC_MIPS_CALL_LO16:
+ case BFD_RELOC_MIPS16_GPREL:
+- assert (! fixP->fx_pcrel);
+ /* Nothing needed to do. The value comes from the reloc entry */
+ break;
+
+@@ -12867,8 +12864,23 @@
+ *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
+ reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
+
+- assert (! fixp->fx_pcrel);
+- reloc->addend = fixp->fx_addnumber;
++ if (fixp->fx_pcrel)
++ {
++ if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
++ {
++ /* At this point, fx_addnumber is "symbol offset - reloc->address".
++ Relocations want only the symbol offset. */
++ reloc->addend = fixp->fx_addnumber + reloc->address;
++ }
++ else
++ {
++ /* A gruesome hack which is a result of the gruesome gas reloc
++ handling. */
++ reloc->addend = reloc->address;
++ }
++ }
++ else
++ reloc->addend = fixp->fx_addnumber;
+
+ /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
+ entry to be used in the relocation's section offset. */
+@@ -12879,6 +12891,16 @@
+ }
+
+ code = fixp->fx_r_type;
++ if (fixp->fx_pcrel)
++ {
++ if (code == BFD_RELOC_32)
++ code = BFD_RELOC_32_PCREL;
++ else
++ as_bad_where (fixp->fx_file, fixp->fx_line,
++ _("Cannot make %s relocation PC relative"),
++ bfd_get_reloc_code_name (code));
++ }
++
+
+ /* To support a PC relative reloc, we used a Cygnus extension.
+ We check for that here to make sure that we don't let such a
+--- binutils/gas/config/tc-mips.h 29 Apr 2004 05:14:22 -0000 1.35
++++ binutils/gas/config/tc-mips.h 5 May 2004 17:38:51 -0000
+@@ -58,6 +58,10 @@
+
+ #define MAX_MEM_FOR_RS_ALIGN_CODE (1 + 2)
+
++/* We permit PC relative difference expressions when generating
++ embedded PIC code. */
++#define DIFF_EXPR_OK
++
+ /* Tell assembler that we have an itbl_mips.h header file to include. */
+ #define HAVE_ITBL_CPU
+