[uClibc-cvs] svn commit: trunk/buildroot/toolchain/binutils/2.15.94.0.2.2

andersen at uclibc.org andersen at uclibc.org
Wed Mar 2 11:15:05 UTC 2005


Author: andersen
Date: 2005-03-02 04:15:05 -0700 (Wed, 02 Mar 2005)
New Revision: 9956

Log:
450-mips-restore-embedded-pic is I believe the minimum necessary to get gcc
3.3.x to compile again on mips.  As was, compiling gcc 3.3.x for mips would
cause gcc to blow up whining about combining symbols from different segments,
since stock binutils no longer supports the PC relative expressions emitted by
gcc 3.3.x for mips when generating embedded PIC code.


Added:
   trunk/buildroot/toolchain/binutils/2.15.94.0.2.2/450-mips-restore-embedded-pic.patch


Changeset:
Added: trunk/buildroot/toolchain/binutils/2.15.94.0.2.2/450-mips-restore-embedded-pic.patch
===================================================================
--- trunk/buildroot/toolchain/binutils/2.15.94.0.2.2/450-mips-restore-embedded-pic.patch	2005-03-02 08:57:32 UTC (rev 9955)
+++ trunk/buildroot/toolchain/binutils/2.15.94.0.2.2/450-mips-restore-embedded-pic.patch	2005-03-02 11:15:05 UTC (rev 9956)
@@ -0,0 +1,75 @@
+--- 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
+ 




More information about the uClibc-cvs mailing list