[PATCH] Correct handling of gcc-[ar|nm|ranlib] exit codes

Meador Inge meadori@codesourcery.com
Thu Sep 27 13:53:00 GMT 2012


Hi All,

The gcc-[ar|nm|ranlib] LTO utils use 'pex_one' to spawn the wrapped binutils
program.  However, currently it is blindly returning the value of the 'err'
parameter for the exit code.  According the documentation [1] 'err' is only
set for an error return and 'status' is only set for a successful return.

This patch fixes the bug by appropriately checking the returned status
and extracting the exit code when needed.  Tested on GNU/Linux and Windows.

OK?

2012-09-27  Meador Inge  <meadori@codesourcery.com>

	* gcc-ar.c (main): Handle the returning of the sub-process error
	code correctly.

[1] http://gcc.gnu.org/onlinedocs/libiberty/Functions.html#Functions

Index: gcc/gcc-ar.c
===================================================================
--- gcc/gcc-ar.c	(revision 191792)
+++ gcc/gcc-ar.c	(working copy)
@@ -42,6 +42,7 @@
   const char *err_msg;
   const char **nargv;
   bool is_ar = !strcmp (PERSONALITY, "ar");
+  int exit_code = FATAL_EXIT_CODE;
 
   exe_name = PERSONALITY;
 #ifdef CROSS_DIRECTORY_STRUCTURE
@@ -96,6 +97,20 @@
 		     NULL,NULL,  &status, &err);
   if (err_msg) 
     fprintf(stderr, "Error running %s: %s\n", exe_name, err_msg);
+  else if (status)
+    {
+      if (WIFSIGNALED (status))
+	{
+	  int sig = WTERMSIG (status);
+	  fprintf (stderr, "%s terminated with signal %d [%s]%s\n",
+		   exe_name, sig, strsignal(sig),
+		   WCOREDUMP(status) ? ", core dumped" : "");
+	}
+      else if (WIFEXITED (status))
+	exit_code = WEXITSTATUS (status);
+    }
+  else
+    exit_code = SUCCESS_EXIT_CODE;
 
-  return err;
+  return exit_code;
 }



More information about the Gcc-patches mailing list