* elflink.h (elf_link_add_object_symbols): Correct conditions
authorIan Lance Taylor <ian@airs.com>
Wed, 11 Oct 1995 04:50:20 +0000 (04:50 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 11 Oct 1995 04:50:20 +0000 (04:50 +0000)
under which type and size change warnings are issued.

bfd/ChangeLog
bfd/elflink.h

index 18f401a..5d3787c 100644 (file)
@@ -1,3 +1,8 @@
+Wed Oct 11 00:49:29 1995  Ian Lance Taylor  <ian@cygnus.com>
+
+       * elflink.h (elf_link_add_object_symbols): Correct conditions
+       under which type and size change warnings are issued.
+
 Tue Oct 10 18:32:46 1995  Ian Lance Taylor  <ian@cygnus.com>
 
        * coffgen.c (coff_count_linenumbers): Don't count line numbers for
index dc2da5e..86328d6 100644 (file)
@@ -555,7 +555,7 @@ elf_link_add_object_symbols (abfd, info)
       const char *name;
       struct elf_link_hash_entry *h;
       boolean definition;
-      boolean wasweak;
+      boolean size_change_ok, type_change_ok;
       boolean new_weakdef;
 
       elf_swap_symbol_in (abfd, esym, &sym);
@@ -642,7 +642,8 @@ elf_link_add_object_symbols (abfd, info)
       else
        definition = true;
 
-      wasweak = false;
+      size_change_ok = false;
+      type_change_ok = false;
       if (info->hash->creator->flavour == bfd_target_elf_flavour)
        {
          /* We need to look up the symbol now in order to get some of
@@ -659,9 +660,17 @@ elf_link_add_object_symbols (abfd, info)
                 || h->root.type == bfd_link_hash_warning)
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
 
-         /* Remember whether this used to be a weak definition.  */
-         wasweak = (h->root.type == bfd_link_hash_defweak
-                    || h->root.type == bfd_link_hash_undefweak);
+         /* It's OK to change the type if it used to be a weak
+             definition.  */
+         type_change_ok = (h->root.type == bfd_link_hash_defweak
+                           || h->root.type == bfd_link_hash_undefweak);
+
+         /* It's OK to change the size if it used to be a weak
+            definition, or if it used to be undefined, or if we will
+            be overriding an old definition.
+            */
+         size_change_ok = (type_change_ok
+                           || h->root.type == bfd_link_hash_undefined);
 
          /* If we are looking at a dynamic object, and this is a
             definition, we need to see if it has already been defined
@@ -678,6 +687,7 @@ elf_link_add_object_symbols (abfd, info)
                {
                  sec = bfd_und_section_ptr;
                  definition = false;
+                 size_change_ok = true;
                }
            }
 
@@ -702,6 +712,7 @@ elf_link_add_object_symbols (abfd, info)
                 with the new definition.  */
              h->root.type = bfd_link_hash_undefined;
              h->root.u.undef.abfd = h->root.u.def.section->owner;
+             size_change_ok = true;
            }
        }
 
@@ -756,7 +767,7 @@ elf_link_add_object_symbols (abfd, info)
          if (sym.st_size != 0
              && (definition || h->size == 0))
            {
-             if (h->size != 0 && h->size != sym.st_size && ! wasweak)
+             if (h->size != 0 && h->size != sym.st_size && ! size_change_ok)
                (*_bfd_error_handler)
                  ("Warning: size of symbol `%s' changed from %lu to %lu in %s",
                   name, (unsigned long) h->size, (unsigned long) sym.st_size,
@@ -769,7 +780,7 @@ elf_link_add_object_symbols (abfd, info)
            {
              if (h->type != STT_NOTYPE
                  && h->type != ELF_ST_TYPE (sym.st_info)
-                 && ! wasweak)
+                 && ! type_change_ok)
                (*_bfd_error_handler)
                  ("Warning: type of symbol `%s' changed from %d to %d in %s",
                   name, h->type, ELF_ST_TYPE (sym.st_info),