* write.c (write_relocs): Use S_IS_DEFINED and S_IS_COMMON rather
authorIan Lance Taylor <ian@airs.com>
Fri, 2 Feb 1996 17:46:05 +0000 (17:46 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 2 Feb 1996 17:46:05 +0000 (17:46 +0000)
than comparing S_GET_SEGMENT to undefined_section.
(write_object_file): Skip symbols which were equated to an
undefined or common symbol.
* symbols.c (resolve_symbol_value): Use S_IS_DEFINED and
S_IS_COMMON rather than comparing S_GET_SEGMENT to
undefined_section.
(S_GET_VALUE): Likewise.  Avoid recursion problems if S_IS_DEFINED
or S_IS_COMMON call S_GET_VALUE.
* config/obj-aout.h (S_IS_COMMON): Define if not BFD_ASSEMBLER.
* config/obj-aout.c (obj_emit_relocations): If a reloc is equated
to an undefined or common symbol, convert the reloc to be against
the target symbol.
(obj_crawl_symbol_chain): Skip symbols which were equated to an
undefined or common symbol.
* config/obj-bout.h (S_IS_COMMON): Define if not BFD_ASSEMBLER.
* config/obj-bout.c (obj_emit_relocations): If a reloc is equated
to an undefined or common symbol, convert the reloc to be against
the target symbol.
(obj_crawl_symbol_chain): Skip symbols which were equated to an
undefined or common symbol.
* config/obj-coff.c (do_relocs_for): Use S_IS_DEFINED and
S_IS_COMMON rather than comparing S_GET_SEGMENT to
undefined_section.
(yank_symbols): Skip symbols which were equated to an undefined or
common symbol.

gas/ChangeLog
gas/config/obj-bout.c
gas/config/obj-bout.h

index 26b6990465b316ed0e579f2f66470d31e9e073f5..6f20f6f3372fe1556c5c69d8b074c4b68d3dd084 100644 (file)
@@ -1,3 +1,32 @@
+Fri Feb  2 12:32:15 1996  Ian Lance Taylor  <ian@cygnus.com>
+
+       * write.c (write_relocs): Use S_IS_DEFINED and S_IS_COMMON rather
+       than comparing S_GET_SEGMENT to undefined_section.
+       (write_object_file): Skip symbols which were equated to an
+       undefined or common symbol.
+       * symbols.c (resolve_symbol_value): Use S_IS_DEFINED and
+       S_IS_COMMON rather than comparing S_GET_SEGMENT to
+       undefined_section.
+       (S_GET_VALUE): Likewise.  Avoid recursion problems if S_IS_DEFINED
+       or S_IS_COMMON call S_GET_VALUE.
+       * config/obj-aout.h (S_IS_COMMON): Define if not BFD_ASSEMBLER.
+       * config/obj-aout.c (obj_emit_relocations): If a reloc is equated
+       to an undefined or common symbol, convert the reloc to be against
+       the target symbol.
+       (obj_crawl_symbol_chain): Skip symbols which were equated to an
+       undefined or common symbol.
+       * config/obj-bout.h (S_IS_COMMON): Define if not BFD_ASSEMBLER.
+       * config/obj-bout.c (obj_emit_relocations): If a reloc is equated
+       to an undefined or common symbol, convert the reloc to be against
+       the target symbol.
+       (obj_crawl_symbol_chain): Skip symbols which were equated to an
+       undefined or common symbol.
+       * config/obj-coff.c (do_relocs_for): Use S_IS_DEFINED and
+       S_IS_COMMON rather than comparing S_GET_SEGMENT to
+       undefined_section.
+       (yank_symbols): Skip symbols which were equated to an undefined or
+       common symbol.
+
 Thu Feb  1 15:34:32 1996  Ian Lance Taylor  <ian@cygnus.com>
 
        * config/obj-aout.h (S_IS_LOCAL): Check for \002 as well as \001.
index ba7cadc370dc46eef0da22e1af75f75041094f3e..0136c17c6e8c974618c9c30decd651408f9e6d32 100644 (file)
@@ -96,6 +96,14 @@ obj_emit_relocations (where, fixP, segment_address_in_file)
       if (fixP->fx_done == 0
          || fixP->fx_r_type != NO_RELOC)
        {
+         symbolS *sym;
+
+         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;
+         fixP->fx_addsy = sym;
+
          tc_bout_fix_to_chars (*where, fixP, segment_address_in_file);
          *where += sizeof (struct relocation_info);
        }                       /* if there's a symbol */
@@ -246,6 +254,15 @@ obj_crawl_symbol_chain (headers)
 
       resolve_symbol_value (symbolP);
 
+      /* Skip symbols which were equated to undefined or common
+        symbols.  */
+      if (symbolP->sy_value.X_op == O_symbol
+         && (! S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP)))
+       {
+         *symbolPP = symbol_next (symbolP);
+         continue;
+       }
+
       /* OK, here is how we decide which symbols go out into the
         brave new symtab.  Symbols that do are:
                
index 81621b96ece9d15b70808fac9f9b793d51dc013b..947a140defc429525b7c3123a8525b0efc648f18 100644 (file)
@@ -181,6 +181,10 @@ struct relocation_info
 
 /* True if symbol has been defined, ie is in N_{TEXT,DATA,BSS,ABS} or N_EXT */
 #define S_IS_DEFINED(s)                ((S_GET_TYPE(s) != N_UNDF) || (S_GET_DESC(s) != 0))
+
+#define S_IS_COMMON(s) \
+  (S_GET_TYPE (s) == N_UNDF && S_GET_VALUE (s) != 0)
+
 #define S_IS_REGISTER(s)       ((s)->sy_symbol.n_type == N_REGISTER)
 
 /* True if a debug special symbol entry */