diff --git a/gdb/cp-support.c b/gdb/cp-support.c
index 562c6f155c7..b8b0fcc0ae2 100644
--- a/gdb/cp-support.c
+++ b/gdb/cp-support.c
@@ -244,7 +244,7 @@ inspect_type (struct demangle_parse_info *info,
 	    }
 
 	  len = buf.size ();
-	  name = (char *) obstack_copy0 (&info->obstack, buf.c_str (), len);
+	  name = obstack_strdup (&info->obstack, buf.string ());
 
 	  /* Turn the result into a new tree.  Note that this
 	     tree will contain pointers into NAME, so NAME cannot
@@ -315,9 +315,7 @@ replace_typedefs_qualified_name (struct demangle_parse_info *info,
 
 	  buf.write (d_left (comp)->u.s_name.s, d_left (comp)->u.s_name.len);
 	  newobj.type = DEMANGLE_COMPONENT_NAME;
-	  newobj.u.s_name.s
-	    = (char *) obstack_copy0 (&info->obstack,
-				      buf.c_str (), buf.size ());
+	  newobj.u.s_name.s = obstack_strdup (&info->obstack, buf.string ());
 	  newobj.u.s_name.len = buf.size ();
 	  if (inspect_type (info, &newobj, finder, data))
 	    {
@@ -379,9 +377,7 @@ replace_typedefs_qualified_name (struct demangle_parse_info *info,
 	 with a DEMANGLE_COMPONENT_NAME node containing the whole
 	 name.  */
       ret_comp->type = DEMANGLE_COMPONENT_NAME;
-      ret_comp->u.s_name.s
-	= (char *) obstack_copy0 (&info->obstack,
-				  buf.c_str (), buf.size ());
+      ret_comp->u.s_name.s = obstack_strdup (&info->obstack, buf.string ());
       ret_comp->u.s_name.len = buf.size ();
       inspect_type (info, ret_comp, finder, data);
     }
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index 00eeb317dc4..0b370cd2e33 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -1440,9 +1440,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 	      if (!new_name.empty ())
 		{
 		  sym_len = new_name.length ();
-		  sym_name = (char *) obstack_copy0 (&objfile->objfile_obstack,
-						     new_name.c_str (),
-						     sym_len);
+		  sym_name = obstack_strdup (&objfile->objfile_obstack,
+					     new_name);
 		}
 	    }
 
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index c688d199d53..0f7ca54715b 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -10962,10 +10962,8 @@ dwarf2_compute_name (const char *name,
 	     INTERMEDIATE_NAME is already canonical, then we need to
 	     copy it to the appropriate obstack.  */
 	  if (canonical_name == NULL || canonical_name == intermediate_name.c_str ())
-	    name = ((const char *)
-		    obstack_copy0 (&objfile->per_bfd->storage_obstack,
-				   intermediate_name.c_str (),
-				   intermediate_name.length ()));
+	    name = obstack_strdup (&objfile->per_bfd->storage_obstack,
+				   intermediate_name);
 	  else
 	    name = canonical_name;
 	}
@@ -12433,10 +12431,8 @@ create_dwo_unit_in_dwp_v1 (struct dwarf2_per_objfile *dwarf2_per_objfile,
 			      virtual_dwo_name.c_str ());
 	}
       dwo_file = new struct dwo_file;
-      dwo_file->dwo_name
-	= (const char *) obstack_copy0 (&objfile->objfile_obstack,
-					virtual_dwo_name.c_str (),
-					virtual_dwo_name.size ());
+      dwo_file->dwo_name = obstack_strdup (&objfile->objfile_obstack,
+					   virtual_dwo_name);
       dwo_file->comp_dir = comp_dir;
       dwo_file->sections.abbrev = sections.abbrev;
       dwo_file->sections.line = sections.line;
@@ -12631,10 +12627,8 @@ create_dwo_unit_in_dwp_v2 (struct dwarf2_per_objfile *dwarf2_per_objfile,
 			      virtual_dwo_name.c_str ());
 	}
       dwo_file = new struct dwo_file;
-      dwo_file->dwo_name
-	= (const char *) obstack_copy0 (&objfile->objfile_obstack,
-					virtual_dwo_name.c_str (),
-					virtual_dwo_name.size ());
+      dwo_file->dwo_name = obstack_strdup (&objfile->objfile_obstack,
+					   virtual_dwo_name);
       dwo_file->comp_dir = comp_dir;
       dwo_file->sections.abbrev =
 	create_dwp_v2_section (dwarf2_per_objfile, &dwp_file->sections.abbrev,
@@ -22118,8 +22112,7 @@ build_error_marker_type (struct dwarf2_cu *cu, struct die_info *die)
 		     objfile_name (objfile),
 		     sect_offset_str (cu->header.sect_off),
 		     sect_offset_str (die->sect_off));
-  saved = (char *) obstack_copy0 (&objfile->objfile_obstack,
-				  message.c_str (), message.length ());
+  saved = obstack_strdup (&objfile->objfile_obstack, message);
 
   return init_type (objfile, TYPE_CODE_ERROR, 0, saved);
 }
@@ -22655,9 +22648,7 @@ dwarf2_canonicalize_name (const char *name, struct dwarf2_cu *cu,
       if (!canon_name.empty ())
 	{
 	  if (canon_name != name)
-	    name = (const char *) obstack_copy0 (obstack,
-						 canon_name.c_str (),
-						 canon_name.length ());
+	    name = obstack_strdup (obstack, canon_name);
 	}
     }
 
diff --git a/gdb/gdb_obstack.h b/gdb/gdb_obstack.h
index 829e2f959c4..db849a06444 100644
--- a/gdb/gdb_obstack.h
+++ b/gdb/gdb_obstack.h
@@ -95,6 +95,16 @@ obstack_strdup (struct obstack *obstackp, const char *string)
   return (char *) obstack_copy0 (obstackp, string, strlen (string));
 }
 
+/* Duplicate STRING, returning an equivalent string that's allocated on the
+   obstack OBSTACKP.  */
+
+static inline char *
+obstack_strdup (struct obstack *obstackp, const std::string &string)
+{
+  return (char *) obstack_copy0 (obstackp, string.c_str (),
+				 string.size ());
+}
+
 /* An obstack that frees itself on scope exit.  */
 struct auto_obstack : obstack
 {
diff --git a/gdb/stabsread.c b/gdb/stabsread.c
index b7524e71a35..23da5f94ebb 100644
--- a/gdb/stabsread.c
+++ b/gdb/stabsread.c
@@ -1654,12 +1654,8 @@ again:
 
 	      std::string new_name = cp_canonicalize_string (name);
 	      if (!new_name.empty ())
-		{
-		  type_name
-		    = (char *) obstack_copy0 (&objfile->objfile_obstack,
-					      new_name.c_str (),
-					      new_name.length ());
-		}
+		type_name = obstack_strdup (&objfile->objfile_obstack,
+					    new_name);
 	    }
 	  if (type_name == NULL)
 	    {
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 4a429dad1ab..47d1919baa5 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -2596,9 +2596,7 @@ reread_symbols (void)
 	  set_objfile_per_bfd (objfile);
 
 	  objfile->original_name
-	    = (char *) obstack_copy0 (&objfile->objfile_obstack,
-				      original_name.c_str (),
-				      original_name.size ());
+	    = obstack_strdup (&objfile->objfile_obstack, original_name);
 
 	  /* Reset the sym_fns pointer.  The ELF reader can change it
 	     based on whether .gdb_index is present, and we need it to
