* symbols.c (resolve_symbol_value): Don't change X_add_number for
[deliverable/binutils-gdb.git] / gas / write.c
index 0cd68c30f5ab1fa4768fdbadc582143e2eba74c3..a67b34aee8a88b3ba06b83dc0ab7941d76c81f46 100644 (file)
@@ -874,7 +874,17 @@ write_relocs (abfd, sec, xxx)
       sym = fixp->fx_addsy;
       while (sym->sy_value.X_op == O_symbol
             && (! S_IS_DEFINED (sym) || S_IS_COMMON (sym)))
-       sym = sym->sy_value.X_add_symbol;
+       {
+         symbolS *n;
+
+         /* We must avoid looping, as that can occur with a badly
+            written program.  */
+         n = sym->sy_value.X_add_symbol;
+         if (n == sym)
+           break;
+         fixp->fx_offset += sym->sy_value.X_add_number;
+         sym = n;
+       }
       fixp->fx_addsy = sym;
 
       reloc = tc_gen_reloc (sec, fixp);
This page took 0.023224 seconds and 4 git commands to generate.