Patches to support traditional mips target (mips-dde-sysv4.2MP).

Ulf Carlsson ulfc@calypso.engr.sgi.com
Wed May 3 05:00:00 GMT 2000


On Wed, 3 May 2000, Koundinya.K wrote:

> Here is the patch for binutils-000428/gas/config/tc-mips.c. This patch also 
> handles a problem with gas while handling weak symbols. 

The part of my patches that fixes the weak symbol handling is attached.  We
use this patch when we're compiling glibc 2.2 and the Linux kernel.  We have
to treat a relocation against a weak symbol as a an external relocation, it's
impossible to override a weak symbol from another object file otherwise.

Ulf

Index: tc-mips.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-mips.c,v
retrieving revision 1.14
diff -u -p -r1.14 tc-mips.c
--- tc-mips.c	2000/04/25 10:02:20	1.14
+++ tc-mips.c	2000/05/03 11:34:39
@@ -9546,7 +9546,10 @@ md_apply_fix (fixP, valueP)
   if (fixP->fx_addsy != NULL && OUTPUT_FLAVOR == bfd_target_elf_flavour)
     {
     if (S_GET_OTHER (fixP->fx_addsy) == STO_MIPS16 
-        || S_IS_WEAK (fixP->fx_addsy)
+	|| (S_IS_WEAK (fixP->fx_addsy)
+	    && !S_IS_COMMON (fixP->fx_addsy))
+	|| (S_IS_EXTERN (fixP->fx_addsy)
+	    && !S_IS_COMMON (fixP->fx_addsy))
         || (symbol_used_in_reloc_p (fixP->fx_addsy)
             && (((bfd_get_section_flags (stdoutput,
                                          S_GET_SEGMENT (fixP->fx_addsy))
@@ -11022,6 +11025,10 @@ md_estimate_size_before_relax (fragp, se
       change = (symsec != &bfd_und_section
 		&& symsec != &bfd_abs_section
 		&& ! bfd_is_com_section (symsec));
+#ifdef OBJ_ELF
+      /* A global symbol is treated as external */
+      change = change ? !(S_IS_EXTERN (sym) || S_IS_WEAK (sym)) : 0;
+#endif
     }
   else
     abort ();
@@ -11057,6 +11064,13 @@ int
 mips_fix_adjustable (fixp)
      fixS *fixp;
 {
+#ifdef OBJ_ELF
+  /* Prevent all adjustments to global symbols. */
+  if (S_IS_EXTERN (fixp->fx_addsy))
+      return 0;
+  if (S_IS_WEAK (fixp->fx_addsy))
+      return 0;
+#endif
   if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP)
     return 0;
   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT




More information about the Binutils mailing list