Mark Wielaard 3c7223
From ef9164520c81ea61efe88777a8ad61bf17a54201 Mon Sep 17 00:00:00 2001
Mark Wielaard 3c7223
From: Mark Wielaard <mark@klomp.org>
Mark Wielaard 3c7223
Date: Sat, 22 Apr 2023 01:26:17 +0200
Mark Wielaard 3c7223
Subject: [PATCH] elfcompress: Don't compress if section already compressed
Mark Wielaard 3c7223
 unless forced
Mark Wielaard 3c7223
Mark Wielaard 3c7223
Before commit a5b07cdf9 "support ZSTD compression algorithm"
Mark Wielaard 3c7223
elfcompress would not try to compress a section if it already
Mark Wielaard 3c7223
had the requested compression type (or was already uncompressed)
Mark Wielaard 3c7223
unless the --force flag was given. An else if construct was changed
Mark Wielaard 3c7223
to an if in the commit causing elfcompress to warn (in verbose mode)
Mark Wielaard 3c7223
but then still try to (re)compress the section.
Mark Wielaard 3c7223
Mark Wielaard 3c7223
Add an explicit check so if nothing needs (un)compressing, the file
Mark Wielaard 3c7223
isn't changed.
Mark Wielaard 3c7223
Mark Wielaard 3c7223
The diff looks large, but git diff -b -w is just:
Mark Wielaard 3c7223
Mark Wielaard 3c7223
+     if (force || type != schtype)
Mark Wielaard 3c7223
+       {
Mark Wielaard 3c7223
          if (shdr->sh_type != SHT_NOBITS
Mark Wielaard 3c7223
              && (shdr->sh_flags & SHF_ALLOC) == 0)
Mark Wielaard 3c7223
            {
Mark Wielaard 3c7223
@@ -554,6 +556,7 @@ process_file (const char *fname)
Mark Wielaard 3c7223
              printf ("[%zd] %s ignoring %s section\n", ndx, sname,
Mark Wielaard 3c7223
                      (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated"));
Mark Wielaard 3c7223
        }
Mark Wielaard 3c7223
+   }
Mark Wielaard 3c7223
Mark Wielaard 3c7223
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard 3c7223
---
Mark Wielaard 3c7223
 src/elfcompress.c | 43 +++++++++++++++++++++++--------------------
Mark Wielaard 3c7223
 1 file changed, 23 insertions(+), 20 deletions(-)
Mark Wielaard 3c7223
Mark Wielaard 3c7223
diff --git a/src/elfcompress.c b/src/elfcompress.c
Mark Wielaard 3c7223
index 18ade66f..f771b92a 100644
Mark Wielaard 3c7223
--- a/src/elfcompress.c
Mark Wielaard 3c7223
+++ b/src/elfcompress.c
Mark Wielaard 3c7223
@@ -529,30 +529,33 @@ process_file (const char *fname)
Mark Wielaard 3c7223
 		  }
Mark Wielaard 3c7223
 	    }
Mark Wielaard 3c7223
 
Mark Wielaard 3c7223
-	  if (shdr->sh_type != SHT_NOBITS
Mark Wielaard 3c7223
-	      && (shdr->sh_flags & SHF_ALLOC) == 0)
Mark Wielaard 3c7223
+	  if (force || type != schtype)
Mark Wielaard 3c7223
 	    {
Mark Wielaard 3c7223
-	      set_section (sections, ndx);
Mark Wielaard 3c7223
-	      /* Check if we might want to change this section name.  */
Mark Wielaard 3c7223
-	      if (! adjust_names
Mark Wielaard 3c7223
-		  && ((type != ZLIB_GNU
Mark Wielaard 3c7223
-		       && startswith (sname, ".zdebug"))
Mark Wielaard 3c7223
-		      || (type == ZLIB_GNU
Mark Wielaard 3c7223
-			  && startswith (sname, ".debug"))))
Mark Wielaard 3c7223
-		adjust_names = true;
Mark Wielaard 3c7223
-
Mark Wielaard 3c7223
-	      /* We need a buffer this large if we change the names.  */
Mark Wielaard 3c7223
-	      if (adjust_names)
Mark Wielaard 3c7223
+	      if (shdr->sh_type != SHT_NOBITS
Mark Wielaard 3c7223
+		  && (shdr->sh_flags & SHF_ALLOC) == 0)
Mark Wielaard 3c7223
 		{
Mark Wielaard 3c7223
-		  size_t slen = strlen (sname);
Mark Wielaard 3c7223
-		  if (slen > maxnamelen)
Mark Wielaard 3c7223
-		    maxnamelen = slen;
Mark Wielaard 3c7223
+		  set_section (sections, ndx);
Mark Wielaard 3c7223
+		  /* Check if we might want to change this section name.  */
Mark Wielaard 3c7223
+		  if (! adjust_names
Mark Wielaard 3c7223
+		      && ((type != ZLIB_GNU
Mark Wielaard 3c7223
+			   && startswith (sname, ".zdebug"))
Mark Wielaard 3c7223
+			  || (type == ZLIB_GNU
Mark Wielaard 3c7223
+			      && startswith (sname, ".debug"))))
Mark Wielaard 3c7223
+		    adjust_names = true;
Mark Wielaard 3c7223
+
Mark Wielaard 3c7223
+		  /* We need a buffer this large if we change the names.  */
Mark Wielaard 3c7223
+		  if (adjust_names)
Mark Wielaard 3c7223
+		    {
Mark Wielaard 3c7223
+		      size_t slen = strlen (sname);
Mark Wielaard 3c7223
+		      if (slen > maxnamelen)
Mark Wielaard 3c7223
+			maxnamelen = slen;
Mark Wielaard 3c7223
+		    }
Mark Wielaard 3c7223
 		}
Mark Wielaard 3c7223
+	      else
Mark Wielaard 3c7223
+		if (verbose >= 0)
Mark Wielaard 3c7223
+		  printf ("[%zd] %s ignoring %s section\n", ndx, sname,
Mark Wielaard 3c7223
+			  (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated"));
Mark Wielaard 3c7223
 	    }
Mark Wielaard 3c7223
-	  else
Mark Wielaard 3c7223
-	    if (verbose >= 0)
Mark Wielaard 3c7223
-	      printf ("[%zd] %s ignoring %s section\n", ndx, sname,
Mark Wielaard 3c7223
-		      (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated"));
Mark Wielaard 3c7223
 	}
Mark Wielaard 3c7223
 
Mark Wielaard 3c7223
       if (shdr->sh_type == SHT_SYMTAB)
Mark Wielaard 3c7223
-- 
Mark Wielaard 3c7223
2.31.1
Mark Wielaard 3c7223