diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 18f401a2870..5d3787ccfb0 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elflink.h b/bfd/elflink.h
index dc2da5ef3dc..86328d6b578 100644
--- a/bfd/elflink.h
+++ b/bfd/elflink.h
@@ -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),