+2021-03-02  Nick Alcock  <nick.alcock@oracle.com>
+
+       * elf-strtab.c (_bfd_elf_strtab_str): Skip strings with zero refcount.
+
 2021-03-02  Alan Modra  <amodra@gmail.com>
 
        PR 27451
 
                     bfd_size_type *offset)
 {
   if (idx == 0)
-    return 0;
+    return NULL;
   BFD_ASSERT (idx < tab->size);
   BFD_ASSERT (tab->sec_size);
+  if (tab->array[idx]->refcount == 0)
+    return NULL;
   if (offset)
     *offset = tab->array[idx]->u.index;
   return tab->array[idx]->root.string;
 
+2021-03-02  Nick Alcock  <nick.alcock@oracle.com>
+
+       * ldelfgen.c (ldelf_ctf_strtab_iter_cb): Skip zero-refcount strings.
+
 2021-03-02  Alan Modra  <amodra@gmail.com>
 
        * testsuite/ld-powerpc/startstop.d,
 
   if (arg->next_i == 0)
     arg->next_i = 1;
 
-  if (arg->next_i >= _bfd_elf_strtab_len (arg->strtab))
+  /* Hunt through strings until we fall off the end or find one with
+     a nonzero refcount.  */
+  do
     {
-      arg->next_i = 0;
-      return NULL;
+      if (arg->next_i >= _bfd_elf_strtab_len (arg->strtab))
+       {
+         arg->next_i = 0;
+         return NULL;
+       }
+
+      ret = _bfd_elf_strtab_str (arg->strtab, arg->next_i++, &off);
     }
+  while (ret == NULL);
 
-  ret = _bfd_elf_strtab_str (arg->strtab, arg->next_i++, &off);
   *offset = off;
 
   /* If we've overflowed, we cannot share any further strings: the CTF
 
+2021-03-02  Nick Alcock  <nick.alcock@oracle.com>
+
+       * ctf-create.c (symtypetab_density): Report the symbol name as
+       well as index in the name != object error; note the likely
+       consequences.
+       * ctf-link.c (ctf_link_shuffle_syms): Report the symbol index
+       as well as name.
+
 2021-03-02  Nick Alcock  <nick.alcock@oracle.com>
 
        * ctf-link.c (ctf_link_shuffle_syms): Free ctf_dynsyms properly.
 
          if ((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
              && sym->st_type != STT_FUNC)
            {
-             ctf_err_warn (fp, 1, 0, _("Symbol %x added to CTF as a function "
-                                       "but is of type %x\n"),
-                           sym->st_symidx, sym->st_type);
+             ctf_err_warn (fp, 1, 0, _("symbol %s (%x) added to CTF as a "
+                                       "function but is of type %x.  "
+                                       "The symbol type lookup tables "
+                                       "are probably corrupted"),
+                           sym->st_name, sym->st_symidx, sym->st_type);
              ctf_dynhash_remove (symhash, name);
              continue;
            }
          else if (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
                   && sym->st_type != STT_OBJECT)
            {
-             ctf_err_warn (fp, 1, 0, _("Symbol %x added to CTF as a data "
-                                       "object but is of type %x\n"),
-                           sym->st_symidx, sym->st_type);
+             ctf_err_warn (fp, 1, 0, _("symbol %s (%x) added to CTF as a "
+                                       "data object but is of type %x.  "
+                                       "The symbol type lookup tables "
+                                       "are probably corrupted"),
+                           sym->st_name, sym->st_symidx, sym->st_type);
              ctf_dynhash_remove (symhash, name);
              continue;
            }
 
         for skippability here.  */
       if (!ctf_symtab_skippable (&did->cid_sym))
        {
-         ctf_dprintf ("symbol name from linker: %s\n", did->cid_sym.st_name);
+         ctf_dprintf ("symbol from linker: %s (%x)\n", did->cid_sym.st_name,
+                      did->cid_sym.st_symidx);
 
          if ((new_sym = malloc (sizeof (ctf_link_sym_t))) == NULL)
            goto local_oom;