* config/tc-mn10300.c (tc_gen_reloc): Replace absolute symbols
authorAlan Modra <amodra@gmail.com>
Thu, 23 Sep 2010 12:11:31 +0000 (12:11 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 23 Sep 2010 12:11:31 +0000 (12:11 +0000)
with the absolute section symbol.

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

index 024eff59811caeac27fc63a87b9a20f0c758212b..0df70c70ec4467237c1ef82378b661f08748a40e 100644 (file)
@@ -1,3 +1,8 @@
+2010-09-23  Alan Modra  <amodra@gmail.com>
+
+       * config/tc-mn10300.c (tc_gen_reloc): Replace absolute symbols
+       with the absolute section symbol.
+
 2010-09-22  Mike Frysinger  <vapier@gentoo.org>
 
        * config/bfin-parse.y: Fix typo in BYTEOP16P comment.
index bf77aa9527d792f0e1f62e9544a4b1f2decf5c93..0a4f26cb59c9a8b00ab64562b45bc3eca16bb83a 100644 (file)
@@ -2191,8 +2191,6 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
       asec = S_GET_SEGMENT (fixp->fx_addsy);
       ssec = S_GET_SEGMENT (fixp->fx_subsy);
 
-      reloc->sym_ptr_ptr = NULL;
-
       /* If we have a difference between two (non-absolute) symbols we must
         generate two relocs (one for each symbol) and allow the linker to
         resolve them - relaxation may change the distances between symbols,
@@ -2212,10 +2210,15 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
 
          reloc->addend = fixp->fx_offset; 
          if (asec == absolute_section)
-           reloc->addend += S_GET_VALUE (fixp->fx_addsy);
-
-         reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
-         *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
+           {
+             reloc->addend += S_GET_VALUE (fixp->fx_addsy);
+             reloc->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
+           }
+         else
+           {
+             reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
+             *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
+           }
 
          fixp->fx_pcrel = 0;
          fixp->fx_done = 1;
@@ -2252,8 +2255,6 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
              return relocs;
            }
 
-         if (reloc->sym_ptr_ptr)
-           free (reloc->sym_ptr_ptr);
          free (reloc);
          return & no_relocs;
        }