public inbox for elfutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] elfcompress: Don't rewrite file if no section data needs to be updated.
@ 2018-07-21 15:15 Mark Wielaard
       [not found] ` <CAFMg4WC6-Py1WqTbASzY5KYkJRdssjOA1oqMFfzOrSegoPJUwg@mail.gmail.com>
  0 siblings, 1 reply; 5+ messages in thread
From: Mark Wielaard @ 2018-07-21 15:15 UTC (permalink / raw)
  To: elfutils-devel; +Cc: Igor Gnatenko, Mark Wielaard

If the input and output file are the same and no section needs to
be updated we really don't need to rewrite the file. Check whether
any matching section is already compressed or (GNU) decompressed.
Skip the section if it doesn't need to be changed. If no section data
needs updating end with success without rewriting/updating file.
With --force the file will still always be updated/rewritten even if
no section data needs to be (de)compressed.

Signed-off-by: Mark Wielaard <mark@klomp.org>
---
 src/ChangeLog     |  6 ++++++
 src/elfcompress.c | 43 +++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index 0e9ab301..50a7045a 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,9 @@
+2018-07-21  Mark Wielaard  <mark@klomp.org>
+
+	* elfcompress.c (get_sections): New function.
+	(process_file): Check whether section needs to change. Don't rewrite
+	file if no section data needs changing.
+
 2018-07-21  Mark Wielaard  <mark@klomp.org>
 
 	* elfcompress.c (process_file): Swap fchmod and fchown calls.
diff --git a/src/elfcompress.c b/src/elfcompress.c
index 1a0f9845..ae4708c5 100644
--- a/src/elfcompress.c
+++ b/src/elfcompress.c
@@ -1,5 +1,5 @@
 /* Compress or decompress an ELF file.
-   Copyright (C) 2015, 2016 Red Hat, Inc.
+   Copyright (C) 2015, 2016, 2018 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -286,6 +286,15 @@ process_file (const char *fname)
     return (sections[ndx / WORD_BITS] & (1U << (ndx % WORD_BITS))) != 0;
   }
 
+  /* How many sections are we going to change?  */
+  size_t get_sections (void)
+  {
+    size_t s = 0;
+    for (size_t i = 0; i < shnum / WORD_BITS + 1; i++)
+      s += __builtin_popcount (sections[i]);
+    return s;
+  }
+
   int cleanup (int res)
   {
     elf_end (elf);
@@ -422,6 +431,9 @@ process_file (const char *fname)
      names change and whether there is a symbol table that might need
      to be adjusted be if the section header name table is changed.
 
+     If nothing needs changing, and the input and output file are the
+     same, we are done.
+
      Second a collection pass that creates the Elf sections and copies
      the data.  This pass will compress/decompress section data when
      needed.  And it will collect all data needed if we'll need to
@@ -464,7 +476,26 @@ process_file (const char *fname)
 
       if (section_name_matches (sname))
 	{
-	  if (shdr->sh_type != SHT_NOBITS
+	  if (!force && type == T_DECOMPRESS
+	      && (shdr->sh_flags & SHF_COMPRESSED) == 0
+	      && strncmp (sname, ".zdebug", strlen (".zdebug")) != 0)
+	    {
+	      if (verbose > 0)
+		printf ("[%zd] %s already decompressed\n", ndx, sname);
+	    }
+	  else if (!force && type == T_COMPRESS_ZLIB
+		   && (shdr->sh_flags & SHF_COMPRESSED) != 0)
+	    {
+	      if (verbose > 0)
+		printf ("[%zd] %s already compressed\n", ndx, sname);
+	    }
+	  else if (!force && type == T_COMPRESS_GNU
+		   && strncmp (sname, ".zdebug", strlen (".zdebug")) == 0)
+	    {
+	      if (verbose > 0)
+		printf ("[%zd] %s already GNU compressed\n", ndx, sname);
+	    }
+	  else if (shdr->sh_type != SHT_NOBITS
 	      && (shdr->sh_flags & SHF_ALLOC) == 0)
 	    {
 	      set_section (ndx);
@@ -518,6 +549,14 @@ process_file (const char *fname)
 	  }
     }
 
+  if (foutput == NULL && get_sections () == 0)
+    {
+      if (verbose > 0)
+	printf ("Nothing to do.\n");
+      fnew = NULL;
+      return cleanup (0);
+    }
+
   if (adjust_names)
     {
       names = dwelf_strtab_init (true);
-- 
2.18.0

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-07-24  8:23 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-21 15:15 [PATCH] elfcompress: Don't rewrite file if no section data needs to be updated Mark Wielaard
     [not found] ` <CAFMg4WC6-Py1WqTbASzY5KYkJRdssjOA1oqMFfzOrSegoPJUwg@mail.gmail.com>
2018-07-22 15:20   ` Mark Wielaard
     [not found]     ` <CAFMg4WC7X3SHi3jgPfidTDpXJjSfFkTvEe8zOK3FxC19_X_haQ@mail.gmail.com>
2018-07-22 20:39       ` Mark Wielaard
     [not found]         ` <CAFMg4WAAhRqCVDRRCSwLHK=_4mBk=FMQ03nGw9NEZJZ8ru4Ljw@mail.gmail.com>
2018-07-24  7:57           ` Mark Wielaard
2018-07-24  8:23             ` Mark Wielaard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).