OSDN Git Service

* config/tc-mmix.c (tc_gen_reloc): Don't try and take the value of
authorHans-Peter Nilsson <hp@axis.com>
Mon, 4 Feb 2002 04:03:15 +0000 (04:03 +0000)
committerHans-Peter Nilsson <hp@axis.com>
Mon, 4 Feb 2002 04:03:15 +0000 (04:03 +0000)
common and weak symbols.  Handle common and weak symbols as
undefined symbols with regards to GREG handling and merging.
(mmix_frob_file): Ditto.

gas/ChangeLog
gas/config/tc-mmix.c

index 82b4521..968ce17 100644 (file)
@@ -1,3 +1,10 @@
+2002-02-04  Hans-Peter Nilsson  <hp@bitrange.com>
+
+       * config/tc-mmix.c (tc_gen_reloc): Don't try and take the value of
+       common and weak symbols.  Handle common and weak symbols as
+       undefined symbols with regards to GREG handling and merging.
+       (mmix_frob_file): Ditto.
+
 2002-02-02  Jason Thorpe  <thorpej@wasabisystems.com>
 
        * configure.in (hppa-*-netbsd*): New target.
index e396027..a8c7e23 100644 (file)
@@ -2587,14 +2587,20 @@ tc_gen_reloc (section, fixP)
      fixS *fixP;
 {
   bfd_signed_vma val
-    = fixP->fx_offset + (fixP->fx_addsy ? S_GET_VALUE (fixP->fx_addsy) : 0);
+    = fixP->fx_offset
+    + (fixP->fx_addsy != NULL
+       && !S_IS_WEAK (fixP->fx_addsy)
+       && !S_IS_COMMON (fixP->fx_addsy)
+       ? S_GET_VALUE (fixP->fx_addsy) : 0);
   arelent *relP;
   bfd_reloc_code_real_type code = BFD_RELOC_NONE;
   char *buf  = fixP->fx_where + fixP->fx_frag->fr_literal;
   symbolS *addsy = fixP->fx_addsy;
   asection *addsec = addsy == NULL ? NULL : S_GET_SEGMENT (addsy);
   asymbol *baddsy = addsy != NULL ? symbol_get_bfdsym (addsy) : NULL;
-  bfd_vma addend = val - (baddsy == NULL ? 0 : bfd_asymbol_value (baddsy));
+  bfd_vma addend
+    = val - (baddsy == NULL || S_IS_COMMON (addsy) || S_IS_WEAK (addsy)
+            ? 0 : bfd_asymbol_value (baddsy));
 
   /* A single " LOCAL expression" in the wrong section will not work when
      linking to MMO; relocations for zero-content sections are then
@@ -2720,7 +2726,9 @@ tc_gen_reloc (section, fixP)
          struct mmix_symbol_gregs *gregs;
          struct mmix_symbol_greg_fixes *fix;
 
-         if (S_IS_DEFINED (addsy))
+         if (S_IS_DEFINED (addsy) 
+             && !bfd_is_com_section (addsec)
+             && !S_IS_WEAK (addsy))
            {
              if (! symbol_section_p (addsy) && ! bfd_is_abs_section (addsec))
                as_fatal (_("internal: BFD_RELOC_MMIX_BASE_PLUS_OFFSET not resolved to section"));
@@ -3592,7 +3600,9 @@ mmix_frob_file ()
 
       /* If the symbol is defined, then it must be resolved to a section
         symbol at this time, or else we don't know how to handle it.  */
-      if (S_IS_DEFINED (sym))
+      if (S_IS_DEFINED (sym)
+         && !bfd_is_com_section (S_GET_SEGMENT (sym))
+         && !S_IS_WEAK (sym))
        {
          if (! symbol_section_p (sym)
              && ! bfd_is_abs_section (S_GET_SEGMENT (sym)))