--- 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