* config/tc-i386.c (tc_i386_fix_adjustable): Don't adjust PLT or
authorIan Lance Taylor <ian@airs.com>
Tue, 28 Feb 1995 20:35:41 +0000 (20:35 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 28 Feb 1995 20:35:41 +0000 (20:35 +0000)
GOT relocs either.

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

index 52c9767689019542ecf1cd35d9b095197a6737dc..cee2bd06f95cdc7208812aafc8ccf196a607918d 100644 (file)
@@ -1,3 +1,8 @@
+Tue Feb 28 15:34:14 1995  Ian Lance Taylor  <ian@cygnus.com>
+
+       * config/tc-i386.c (tc_i386_fix_adjustable): Don't adjust PLT or
+       GOT relocs either.
+
 Mon Feb 27 13:03:41 1995  Kung Hsu  <kung@mexican.cygnus.com>
 
        * configure.in: add a29k-*-vxworks configuration.
index 2dc425231dc22c687185125225162c3d014b1455..2b58afff82427d5e9f6a6202ae114af28018a6f3 100644 (file)
@@ -27,6 +27,7 @@
 #include <ctype.h>
 
 #include "as.h"
+#include "subsegs.h"
 
 #include "obstack.h"
 #include "opcode/i386.h"
@@ -686,15 +687,20 @@ reloc (size, pcrel, other)
  * to make sure that the dynamic relocations are done correctly, so in
  * some cases we force the original symbol to be used.
  */
+int
 tc_i386_fix_adjustable(fixP)
      fixS * fixP;
 {
+#ifndef OBJ_AOUT
   /* Prevent all adjustments to global symbols. */
-  if (!S_IS_LOCAL (fixP->fx_addsy))
+  if (S_IS_EXTERN (fixP->fx_addsy))
     return 0;
+#endif
 #ifdef BFD_ASSEMBLER
   /* adjust_reloc_syms doesn't know about the GOT */
-  if (fixP->fx_r_type == BFD_RELOC_386_GOTOFF)
+  if (fixP->fx_r_type == BFD_RELOC_386_GOTOFF
+      || fixP->fx_r_type == BFD_RELOC_386_PLT32
+      || fixP->fx_r_type == BFD_RELOC_386_GOT32)
     return 0;
 #endif
   return 1;
@@ -1788,9 +1794,12 @@ md_assemble (line)
                        insn_size += size;
 #ifdef BFD_ASSEMBLER
                        if (r_type == BFD_RELOC_32
-                           && i.imms[n]->X_op == O_symbol
                            && GOT_symbol
-                           && GOT_symbol == i.imms[n]->X_add_symbol)
+                           && GOT_symbol == i.imms[n]->X_add_symbol
+                           && (i.imms[n]->X_op == O_symbol
+                               || (i.imms[n]->X_op == O_add
+                                   && (i.imms[n]->X_op_symbol->sy_value.X_op
+                                       == O_subtract))))
                          {
                            r_type = BFD_RELOC_386_GOTPC;
                            i.imms[n]->X_add_number += 3;
@@ -2158,7 +2167,7 @@ i386_operand (operand_string)
             * into a temporary buffer...
             */
            register char *cp;
-           if (cp = strchr(input_line_pointer,'@')) {
+           if ((cp = strchr (input_line_pointer,'@')) != NULL) {
              char tmpbuf[BUFSIZ];
              
              if(!GOT_symbol)