Bug 21522 - eu-strip generates empty output if there is nothing to do
Summary: eu-strip generates empty output if there is nothing to do
Status: RESOLVED FIXED
Alias: None
Product: elfutils
Classification: Unclassified
Component: tools (show other bugs)
Version: unspecified
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2017-05-25 15:40 UTC by Paulo Andrade
Modified: 2017-06-14 13:12 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed: 2017-06-07 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Paulo Andrade 2017-05-25 15:40:57 UTC
Steps to reproduce:

$ cat test.c
int main() { return 1; }

$ gcc test.c

$ eu-strip -g -o test ./a.out

  The "test" file will have zero bytes.
  This happens because of the test in src/strip.c:

  /* Test whether we are doing anything at all.  */
  if (cnt == idx)
    /* Nope, all removable sections are already gone.  */
    goto fail_close;

  Note also that, if the test is removed, it still
generates a different binary, so, the test is incomplete,
or should be removed.
Comment 1 Mark Wielaard 2017-06-02 13:18:19 UTC
We seem to never remove the output file if we created it, but couldn't finish it (either because there is nothing to do or some error occurred). We should always remove it in that case.

Testing the following:

diff --git a/src/strip.c b/src/strip.c
index f747441..c5dbc9c 100644
--- a/src/strip.c
+++ b/src/strip.c
@@ -1063,8 +1063,11 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
 
   /* Test whether we are doing anything at all.  */
   if (cnt == idx)
-    /* Nope, all removable sections are already gone.  */
-    goto fail_close;
+    {
+      /* Nope, all removable sections are already gone.  */
+      result = 1;
+      goto fail_close;
+    }
 
   /* Create the reference to the file with the debug info.  */
   if (debug_fname != NULL && !remove_shdrs)
@@ -2226,7 +2229,11 @@ cannot set access and modification date of '%s'"),
 
   /* Close the file descriptor if we created a new file.  */
   if (output_fname != NULL)
-    close (fd);
+    {
+      close (fd);
+      if (result != 0)
+	unlink (output_fname);
+    }
 
   return result;
 }
Comment 2 Mark Wielaard 2017-06-07 18:43:23 UTC
The patch that I came up with works slightly different. While writing a testcase I noticed we have a similar (though opposite) issue with -f debug. Also it felt more correct to always make sure the -o output file was correct (and not just not generate it if nothing was stripped out).

https://sourceware.org/ml/elfutils-devel/2017-q2/msg00237.html
Comment 3 Mark Wielaard 2017-06-14 13:12:37 UTC
commit b58aebe71e0b4863db1b7fd3e942e36303257f3a
Author: Mark Wielaard <mark@klomp.org>
Date:   Wed Jun 7 20:32:38 2017 +0200

    strip: Don't generate empty output file when nothing to do.
    
    If there was nothing to do strip would skip generating a separate
    debug file if one was requested, but it would also not finish the
    creation of a new output file (with the non-stripped sections).
    Also if there was an error any partially created output would be kept.
    
    Make sure that when the -o output file option is given we always generate
    a complete output file (except on error). Also make sure that when the -f
    debug file option is given it is only generated when it is not empty.
    
    Add testcase run-strip-nothing.sh that tests the various combinations.
    
    https://sourceware.org/bugzilla/show_bug.cgi?id=21522
    
    Signed-off-by: Mark Wielaard <mark@klomp.org>