TMS320C54X only.  */
 #define SEC_TIC54X_BLOCK           0x10000000
 
-  /* This section should be renamed.  This is for ELF linker
-     internal use only.  */
-#define SEC_ELF_RENAME             0x10000000
-
   /* Conditionally link this section; do not link if there are no
      references found to any symbol in the section.  This is for TI
      TMS320C54X only.  */
 
 int bfd_get_compression_header_size (bfd *abfd, asection *sec);
 
-bfd_size_type bfd_convert_section_size
-   (bfd *ibfd, asection *isec, bfd *obfd, bfd_size_type size);
+bool bfd_convert_section_setup
+   (bfd *ibfd, asection *isec, bfd *obfd,
+    const char **new_name, bfd_size_type *new_size);
 
 bool bfd_convert_section_contents
    (bfd *ibfd, asection *isec, bfd *obfd,
 
 
 /*
 FUNCTION
-       bfd_convert_section_size
+       bfd_convert_section_setup
 
 SYNOPSIS
-       bfd_size_type bfd_convert_section_size
-         (bfd *ibfd, asection *isec, bfd *obfd, bfd_size_type size);
+       bool bfd_convert_section_setup
+         (bfd *ibfd, asection *isec, bfd *obfd,
+          const char **new_name, bfd_size_type *new_size);
 
 DESCRIPTION
-       Convert the size @var{size} of the section @var{isec} in input
-       BFD @var{ibfd} to the section size in output BFD @var{obfd}.
+       Do early setup for objcopy, when copying @var{isec} in input
+       BFD @var{ibfd} to output BFD @var{obfd}.  Returns the name and
+       size of the output section.
 */
 
-bfd_size_type
-bfd_convert_section_size (bfd *ibfd, sec_ptr isec, bfd *obfd,
-                         bfd_size_type size)
+bool
+bfd_convert_section_setup (bfd *ibfd, asection *isec, bfd *obfd,
+                          const char **new_name, bfd_size_type *new_size)
 {
   bfd_size_type hdr_size;
 
+  if ((isec->flags & SEC_DEBUGGING) != 0
+      && (isec->flags & SEC_HAS_CONTENTS) != 0)
+    {
+      const char *name = *new_name;
+
+      if ((ibfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI)) != 0)
+       {
+         /* When we decompress or compress with SHF_COMPRESSED,
+            convert section name from .zdebug_* to .debug_*.  */
+         if (startswith (name, ".zdebug_"))
+           {
+             name = bfd_zdebug_name_to_debug (obfd, name);
+             if (name == NULL)
+               return false;
+           }
+       }
+
+      /* PR binutils/18087: Compression does not always make a
+        section smaller.  So only rename the section when
+        compression has actually taken place.  If input section
+        name is .zdebug_*, we should never compress it again.  */
+      else if (isec->compress_status == COMPRESS_SECTION_DONE
+              && startswith (name, ".debug_"))
+       {
+         name = bfd_debug_name_to_zdebug (obfd, name);
+         if (name == NULL)
+           return false;
+       }
+      *new_name = name;
+    }
+  *new_size = bfd_section_size (isec);
+
   /* Do nothing if either input or output aren't ELF.  */
   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
-    return size;
+    return true;
 
   /* Do nothing if ELF classes of input and output are the same. */
   if (get_elf_backend_data (ibfd)->s->elfclass
       == get_elf_backend_data (obfd)->s->elfclass)
-    return size;
+    return true;
 
   /* Convert GNU property size.  */
   if (startswith (isec->name, NOTE_GNU_PROPERTY_SECTION_NAME))
-    return _bfd_elf_convert_gnu_property_size (ibfd, obfd);
+    {
+      *new_size = _bfd_elf_convert_gnu_property_size (ibfd, obfd);
+      return true;
+    }
 
   /* Do nothing if input file will be decompressed.  */
   if ((ibfd->flags & BFD_DECOMPRESS))
-    return size;
+    return true;
 
   /* Do nothing if the input section isn't a SHF_COMPRESSED section. */
   hdr_size = bfd_get_compression_header_size (ibfd, isec);
   if (hdr_size == 0)
-    return size;
+    return true;
 
   /* Adjust the size of the output SHF_COMPRESSED section.  */
   if (hdr_size == sizeof (Elf32_External_Chdr))
-    return (size - sizeof (Elf32_External_Chdr)
-           + sizeof (Elf64_External_Chdr));
+    *new_size += sizeof (Elf64_External_Chdr) - sizeof (Elf32_External_Chdr);
   else
-    return (size - sizeof (Elf64_External_Chdr)
-           + sizeof (Elf32_External_Chdr));
+    *new_size += sizeof (Elf32_External_Chdr) - sizeof (Elf64_External_Chdr);
+  return true;
 }
 
 /*
 
              return false;
            }
 #endif
-       }
-
-      if (action != nothing)
-       {
-         if (abfd->is_linker_input)
+         if (abfd->is_linker_input
+             && name[1] == 'z')
            {
-             if (name[1] == 'z'
-                 && (action == decompress
-                     || (action == compress
-                         && (abfd->flags & BFD_COMPRESS_GABI) != 0)))
-               {
-                 /* Convert section name from .zdebug_* to .debug_* so
-                    that linker will consider this section as a debug
-                    section.  */
-                 char *new_name = bfd_zdebug_name_to_debug (abfd, name);
-                 if (new_name == NULL)
-                   return false;
-                 bfd_rename_section (newsect, new_name);
-               }
+             /* Rename section from .zdebug_* to .debug_* so that ld
+                scripts will see this section as a debug section.  */
+             char *new_name = bfd_zdebug_name_to_debug (abfd, name);
+             if (new_name == NULL)
+               return false;
+             bfd_rename_section (newsect, new_name);
            }
-         else
-           /* For objdump, don't rename the section.  For objcopy, delay
-              section rename to elf_fake_sections.  */
-           newsect->flags |= SEC_ELF_RENAME;
        }
     }
 
 
   this_hdr = &esd->this_hdr;
 
-  if (arg->link_info)
-    {
-      /* ld: compress DWARF debug sections with names: .debug_*.  */
-      if ((arg->link_info->compress_debug & COMPRESS_DEBUG)
-         && (asect->flags & SEC_DEBUGGING)
-         && name[1] == 'd'
-         && name[6] == '_')
-       {
-         /* Set SEC_ELF_COMPRESS to indicate this section should be
-            compressed.  */
-         asect->flags |= SEC_ELF_COMPRESS;
-         /* If this section will be compressed, delay adding section
-            name to section name section after it is compressed in
-            _bfd_elf_assign_file_positions_for_non_load.  */
-         delay_st_name_p = true;
-       }
-    }
-  else if ((asect->flags & SEC_ELF_RENAME))
-    {
-      /* objcopy: rename output DWARF debug section.  */
-      if ((abfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI)))
-       {
-         /* When we decompress or compress with SHF_COMPRESSED,
-            convert section name from .zdebug_* to .debug_* if
-            needed.  */
-         if (name[1] == 'z')
-           {
-             char *new_name = bfd_zdebug_name_to_debug (abfd, name);
-             if (new_name == NULL)
-               {
-                 arg->failed = true;
-                 return;
-               }
-             name = new_name;
-           }
-       }
-      else if (asect->compress_status == COMPRESS_SECTION_DONE
-              && name[1] == 'd')
-       {
-         /* PR binutils/18087: Compression does not always make a
-            section smaller.  So only rename the section when
-            compression has actually taken place.  If input section
-            name is .zdebug_*, we should never compress it again.  */
-         char *new_name = bfd_debug_name_to_zdebug (abfd, name);
-         if (new_name == NULL)
-           {
-             arg->failed = true;
-             return;
-           }
-         name = new_name;
-       }
+  /* ld: compress DWARF debug sections with names: .debug_*.  */
+  if (arg->link_info
+      && (arg->link_info->compress_debug & COMPRESS_DEBUG) != 0
+      && (asect->flags & SEC_DEBUGGING)
+      && name[1] == 'd'
+      && name[6] == '_')
+    {
+      /* Set SEC_ELF_COMPRESS to indicate this section should be
+        compressed.  */
+      asect->flags |= SEC_ELF_COMPRESS;
+      /* If this section will be compressed, delay adding section
+        name to section name section after it is compressed in
+        _bfd_elf_assign_file_positions_for_non_load.  */
+      delay_st_name_p = true;
     }
 
   if (delay_st_name_p)
 
 .     TMS320C54X only.  *}
 .#define SEC_TIC54X_BLOCK           0x10000000
 .
-.  {* This section should be renamed.  This is for ELF linker
-.     internal use only.  *}
-.#define SEC_ELF_RENAME             0x10000000
-.
 .  {* Conditionally link this section; do not link if there are no
 .     references found to any symbol in the section.  This is for TI
 .     TMS320C54X only.  *}
 
       flags &= ~clr;
     }
 
+  if (!bfd_convert_section_setup (ibfd, isection, obfd, &name, &size))
+    {
+      osection = NULL;
+      err = _("failed to create output section");
+      goto loser;
+    }
+
   osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
 
   if (osection == NULL)
       goto loser;
     }
 
-  size = bfd_section_size (isection);
-  size = bfd_convert_section_size (ibfd, isection, obfd, size);
   if (copy_byte >= 0)
     size = (size + interleave - 1) / interleave * copy_width;
   else if (extract_symbol)