elfcompress: Don't compress if section already compressed unless forced

Message ID 20230421234543.1052146-1-mark@klomp.org
State Committed
Headers
Series elfcompress: Don't compress if section already compressed unless forced |

Commit Message

Mark Wielaard April 21, 2023, 11:45 p.m. UTC
  Before commit a5b07cdf9 "support ZSTD compression algorithm"
elfcompress would not try to compress a section if it already
had the requested compression type (or was already uncompressed)
unless the --force flag was given. An else if construct was changed
to an if in the commit causing elfcompress to warn (in verbose mode)
but then still try to (re)compress the section.

Add an explicit check so if nothing needs (un)compressing, the file
isn't changed.

The diff looks large, but git diff -b -w is just:

+     if (force || type != schtype)
+       {
          if (shdr->sh_type != SHT_NOBITS
              && (shdr->sh_flags & SHF_ALLOC) == 0)
            {
@@ -554,6 +556,7 @@ process_file (const char *fname)
              printf ("[%zd] %s ignoring %s section\n", ndx, sname,
                      (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated"));
        }
+   }

Signed-off-by: Mark Wielaard <mark@klomp.org>
---
 src/elfcompress.c | 43 +++++++++++++++++++++++--------------------
 1 file changed, 23 insertions(+), 20 deletions(-)
  

Comments

Mark Wielaard May 8, 2023, 4:16 p.m. UTC | #1
Hi,

On Sat, 2023-04-22 at 01:45 +0200, Mark Wielaard wrote:
> Before commit a5b07cdf9 "support ZSTD compression algorithm"
> elfcompress would not try to compress a section if it already
> had the requested compression type (or was already uncompressed)
> unless the --force flag was given. An else if construct was changed
> to an if in the commit causing elfcompress to warn (in verbose mode)
> but then still try to (re)compress the section.
> 
> Add an explicit check so if nothing needs (un)compressing, the file
> isn't changed.
> 
> The diff looks large, but git diff -b -w is just:
> 
> +     if (force || type != schtype)
> +       {
>           if (shdr->sh_type != SHT_NOBITS
>               && (shdr->sh_flags & SHF_ALLOC) == 0)
>             {
> @@ -554,6 +556,7 @@ process_file (const char *fname)
>               printf ("[%zd] %s ignoring %s section\n", ndx, sname,
>                       (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated"));
>         }
> +   }

This was tested in Fedora and I now pushed it.

Cheers,

Mark
  

Patch

diff --git a/src/elfcompress.c b/src/elfcompress.c
index 18ade66f..f771b92a 100644
--- a/src/elfcompress.c
+++ b/src/elfcompress.c
@@ -529,30 +529,33 @@  process_file (const char *fname)
 		  }
 	    }
 
-	  if (shdr->sh_type != SHT_NOBITS
-	      && (shdr->sh_flags & SHF_ALLOC) == 0)
+	  if (force || type != schtype)
 	    {
-	      set_section (sections, ndx);
-	      /* Check if we might want to change this section name.  */
-	      if (! adjust_names
-		  && ((type != ZLIB_GNU
-		       && startswith (sname, ".zdebug"))
-		      || (type == ZLIB_GNU
-			  && startswith (sname, ".debug"))))
-		adjust_names = true;
-
-	      /* We need a buffer this large if we change the names.  */
-	      if (adjust_names)
+	      if (shdr->sh_type != SHT_NOBITS
+		  && (shdr->sh_flags & SHF_ALLOC) == 0)
 		{
-		  size_t slen = strlen (sname);
-		  if (slen > maxnamelen)
-		    maxnamelen = slen;
+		  set_section (sections, ndx);
+		  /* Check if we might want to change this section name.  */
+		  if (! adjust_names
+		      && ((type != ZLIB_GNU
+			   && startswith (sname, ".zdebug"))
+			  || (type == ZLIB_GNU
+			      && startswith (sname, ".debug"))))
+		    adjust_names = true;
+
+		  /* We need a buffer this large if we change the names.  */
+		  if (adjust_names)
+		    {
+		      size_t slen = strlen (sname);
+		      if (slen > maxnamelen)
+			maxnamelen = slen;
+		    }
 		}
+	      else
+		if (verbose >= 0)
+		  printf ("[%zd] %s ignoring %s section\n", ndx, sname,
+			  (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated"));
 	    }
-	  else
-	    if (verbose >= 0)
-	      printf ("[%zd] %s ignoring %s section\n", ndx, sname,
-		      (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated"));
 	}
 
       if (shdr->sh_type == SHT_SYMTAB)