diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index bdd3ef0fdcf..98acdfb3fb8 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+Mon Feb 26 14:01:13 1996  Ian Lance Taylor  <ian@cygnus.com>
+
+	* cofflink.c (_bfd_coff_link_input_bfd): Don't try to optimize a
+	struct/union/enum type with no elements.
+
 Sat Feb 24 11:38:58 1996  Ian Lance Taylor  <ian@cygnus.com>
 
 	* bfd.c (bfd_errmsg): Handle a NULL return from strerror.
diff --git a/bfd/cofflink.c b/bfd/cofflink.c
index 999a81e1bbb..92b19e21b96 100644
--- a/bfd/cofflink.c
+++ b/bfd/cofflink.c
@@ -1,5 +1,5 @@
 /* COFF specific linker code.
-   Copyright 1994, 1995 Free Software Foundation, Inc.
+   Copyright 1994, 1995, 1996 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -365,7 +365,7 @@ coff_link_add_symbols (abfd, info)
 	      value -= section->vma;
 	    }
 
-	  if (! (_bfd_generic_link_add_one_symbol
+	  if (! (bfd_coff_link_add_one_symbol
 		 (info, abfd, name, flags, section, value,
 		  (const char *) NULL, copy, false,
 		  (struct bfd_link_hash_entry **) sym_hash)))
@@ -1189,7 +1189,6 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
 	  struct coff_debug_merge_element **epp;
 	  bfd_byte *esl, *eslend;
 	  struct internal_syment *islp;
-	  struct coff_debug_merge_type *mtl;
 
 	  name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf);
 	  if (name == NULL)
@@ -1293,42 +1292,50 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
 	    }
 
 	  /* See if we already have a definition which matches this
-             type.  */
-	  for (mtl = mh->types; mtl != NULL; mtl = mtl->next)
+             type.  We always output the type if it has no elements,
+             for simplicity.  */
+	  if (mt->elements == NULL)
+	    bfd_release (input_bfd, (PTR) mt);
+	  else
 	    {
-	      struct coff_debug_merge_element *me, *mel;
+	      struct coff_debug_merge_type *mtl;
 
-	      if (mtl->class != mt->class)
-		continue;
-
-	      for (me = mt->elements, mel = mtl->elements;
-		   me != NULL && mel != NULL;
-		   me = me->next, mel = mel->next)
+	      for (mtl = mh->types; mtl != NULL; mtl = mtl->next)
 		{
-		  if (strcmp (me->name, mel->name) != 0
-		      || me->type != mel->type
-		      || me->tagndx != mel->tagndx)
+		  struct coff_debug_merge_element *me, *mel;
+
+		  if (mtl->class != mt->class)
+		    continue;
+
+		  for (me = mt->elements, mel = mtl->elements;
+		       me != NULL && mel != NULL;
+		       me = me->next, mel = mel->next)
+		    {
+		      if (strcmp (me->name, mel->name) != 0
+			  || me->type != mel->type
+			  || me->tagndx != mel->tagndx)
+			break;
+		    }
+
+		  if (me == NULL && mel == NULL)
 		    break;
 		}
 
-	      if (me == NULL && mel == NULL)
-		break;
-	    }
-
-	  if (mtl == NULL || (bfd_size_type) mtl->indx >= syment_base)
-	    {
-	      /* This is the first definition of this type.  */
-	      mt->indx = output_index;
-	      mt->next = mh->types;
-	      mh->types = mt;
-	    }
-	  else
-	    {
-	      /* This is a redefinition which can be merged.  */
-	      bfd_release (input_bfd, (PTR) mt);
-	      *indexp = mtl->indx;
-	      add = (eslend - esym) / isymesz;
-	      skip = true;
+	      if (mtl == NULL || (bfd_size_type) mtl->indx >= syment_base)
+		{
+		  /* This is the first definition of this type.  */
+		  mt->indx = output_index;
+		  mt->next = mh->types;
+		  mh->types = mt;
+		}
+	      else
+		{
+		  /* This is a redefinition which can be merged.  */
+		  bfd_release (input_bfd, (PTR) mt);
+		  *indexp = mtl->indx;
+		  add = (eslend - esym) / isymesz;
+		  skip = true;
+		}
 	    }
 	}