* write.c (adjust_reloc_syms): If the fixup symbol has been
authorIan Lance Taylor <ian@airs.com>
Thu, 19 Dec 1996 17:07:14 +0000 (17:07 +0000)
committerIan Lance Taylor <ian@airs.com>
Thu, 19 Dec 1996 17:07:14 +0000 (17:07 +0000)
equated to an undefined symbol, convert the fixup to being against
the target symbol.  Remove obsolete code handling a special case
for i386 PIC.

gas/ChangeLog
gas/write.c

index 79133f0d2976f5c07d4e595e351807c196865d0b..85776a04913fc574cbed3625f13b3c2321dd3447 100644 (file)
@@ -1,3 +1,10 @@
+Thu Dec 19 12:06:08 1996  Ian Lance Taylor  <ian@cygnus.com>
+
+       * write.c (adjust_reloc_syms): If the fixup symbol has been
+       equated to an undefined symbol, convert the fixup to being against
+       the target symbol.  Remove obsolete code handling a special case
+       for i386 PIC.
+
 start-sanitize-d10v
 Wed Dec 18 16:00:42 1996  Martin M. Hunt  <hunt@pizza.cygnus.com>
 
index ab026f1f5a9f2e8d2a899f0bad98ee82b4802694..18ebc49086fa5d01fa6588a56ad547982846ecd2 100644 (file)
@@ -667,7 +667,6 @@ adjust_reloc_syms (abfd, sec, xxx)
 #endif
 
        sym = fixp->fx_addsy;
-       symsec = sym->bsym->section;
 
        /* All symbols should have already been resolved at this
           point.  It is possible to see unresolved expression
@@ -678,6 +677,18 @@ adjust_reloc_syms (abfd, sec, xxx)
        if (fixp->fx_subsy != NULL && ! fixp->fx_subsy->sy_resolved)
          resolve_symbol_value (fixp->fx_subsy);
 
+       /* If this symbol is equated to an undefined symbol, convert
+           the fixup to being against that symbol.  */
+       if (sym->sy_value.X_op == O_symbol
+           && (! S_IS_DEFINED (sym) || S_IS_COMMON (sym)))
+         {
+           fixp->fx_offset += sym->sy_value.X_add_number;
+           sym = sym->sy_value.X_add_symbol;
+           fixp->fx_addsy = sym;
+         }
+
+       symsec = S_GET_SEGMENT (sym);
+
        if (sym != NULL && sym->sy_mri_common)
          {
            /* These symbols are handled specially in fixup_segment.  */
@@ -781,27 +792,6 @@ adjust_reloc_syms (abfd, sec, xxx)
          }
 #endif
 
-       /* For PIC support: We may get expressions like
-          "_GLOBAL_OFFSET_TABLE_+(.-L5)" where "." and "L5" may not
-          necessarily have had a fixed difference initially.  But now
-          it should be a known constant, so we can reduce it.  Since
-          we can't easily handle a symbol value that looks like
-          someUndefinedSymbol+const, though, we convert the fixup to
-          access the undefined symbol directly, and discard the
-          intermediate symbol.  */
-       if (S_GET_SEGMENT (sym) == expr_section
-           && sym->sy_value.X_op == O_add
-           && (resolve_symbol_value (sym->sy_value.X_add_symbol),
-               S_GET_SEGMENT (sym->sy_value.X_add_symbol) == undefined_section)
-           && (resolve_symbol_value (sym->sy_value.X_op_symbol),
-               S_GET_SEGMENT (sym->sy_value.X_op_symbol) == absolute_section))
-         {
-           fixp->fx_offset += S_GET_VALUE (sym->sy_value.X_op_symbol);
-           fixp->fx_offset += sym->sy_value.X_add_number;
-           fixp->fx_addsy = sym->sy_value.X_add_symbol;
-           goto reduce_fixup;
-         }
-
        /* If the section symbol isn't going to be output, the relocs
           at least should still work.  If not, figure out what to do
           when we run into that case.