Get rid of SEC_ELF_RENAME
authorAlan Modra <amodra@gmail.com>
Tue, 6 Dec 2022 04:10:10 +0000 (14:40 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 6 Dec 2022 04:10:10 +0000 (14:40 +1030)
SEC_ELF_RENAME is a flag used to effect section name changes when
compressing/decompressing zlib-gnu debug sections.  This can be
accomplished more directly in one of the objcopy specific bfd
functions.  Renaming for ld input is simplified too.  Ld input object
files always have BFD_DECOMPRESS set.

bfd/
* compress.c (bfd_convert_section_size): Rename to..
(bfd_convert_section_setup): ..this.  Handle objcopy renaming
of compressed/decompressed debug sections.
* elf.c (_bfd_elf_make_section_from_shdr): Only rename zdebug
input for linker.
(elf_fake_sections): Don't handle renaming of debug sections for
objcopy here.
* section.c (SEC_ELF_RENAME): Delete.
* bfd-in2.h: Regenerate.
binutils/
* objcopy.c (setup_section): Call bfd_convert_section_setup.
Don't call bfd_convert_section_size.

bfd/bfd-in2.h
bfd/compress.c
bfd/elf.c
bfd/section.c
binutils/objcopy.c

index 24f9305c47c69c7e8f0b0088316d695409d272b7..d983268563d993e0ab74077ab47e23912d09de19 100644 (file)
@@ -932,10 +932,6 @@ typedef struct bfd_section
      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.  */
@@ -7982,8 +7978,9 @@ void bfd_update_compression_header
 
 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,
index a4e6a8ee7b5225cf805060f5e9f1c4ffb12ca949..bb55a6ec0ac656a509882afdae2b4c81e649baf9 100644 (file)
@@ -225,53 +225,89 @@ bfd_get_compression_header_size (bfd *abfd, asection *sec)
 
 /*
 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;
 }
 
 /*
index a013f8885c7ac7e018d16caa9117f0146bb9ce82..61058deaea1d43cb6bcee02502c5145a757c9109 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -1246,30 +1246,16 @@ _bfd_elf_make_section_from_shdr (bfd *abfd,
              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;
        }
     }
 
@@ -3181,57 +3167,20 @@ elf_fake_sections (bfd *abfd, asection *asect, void *fsarg)
 
   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)
index f73e0345e1582cfd487bf87d3de15fffa8bf78cc..30ab6a7d3383d9921cc5b6f5d7fe68f83fd2a3a5 100644 (file)
@@ -347,10 +347,6 @@ CODE_FRAGMENT
 .     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.  *}
index 6814e20a2fca86a8a393538cd1629da4c692122e..19dbb50d3e6182768cde01d6c087738f87133c0c 100644 (file)
@@ -4118,6 +4118,13 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
       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)
@@ -4126,8 +4133,6 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
       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)