1515#include <objtool/objtool.h>
1616#include <objtool/warn.h>
1717
18- const char * objname ;
18+ #define ORIG_SUFFIX ".orig"
1919
20+ int orig_argc ;
21+ static char * * orig_argv ;
22+ const char * objname ;
2023struct opts opts ;
2124
2225static const char * const check_usage [] = {
@@ -224,39 +227,73 @@ static int copy_file(const char *src, const char *dst)
224227 return 0 ;
225228}
226229
227- static char * * save_argv (int argc , const char * * argv )
230+ static void save_argv (int argc , const char * * argv )
228231{
229- char * * orig_argv ;
230-
231232 orig_argv = calloc (argc , sizeof (char * ));
232233 if (!orig_argv ) {
233234 WARN_GLIBC ("calloc" );
234- return NULL ;
235+ exit ( 1 ) ;
235236 }
236237
237238 for (int i = 0 ; i < argc ; i ++ ) {
238239 orig_argv [i ] = strdup (argv [i ]);
239240 if (!orig_argv [i ]) {
240241 WARN_GLIBC ("strdup(%s)" , orig_argv [i ]);
241- return NULL ;
242+ exit ( 1 ) ;
242243 }
243244 };
244-
245- return orig_argv ;
246245}
247246
248- #define ORIG_SUFFIX ".orig"
247+ void print_args (void )
248+ {
249+ char * backup = NULL ;
250+
251+ if (opts .output || opts .dryrun )
252+ goto print ;
253+
254+ /*
255+ * Make a backup before kbuild deletes the file so the error
256+ * can be recreated without recompiling or relinking.
257+ */
258+ backup = malloc (strlen (objname ) + strlen (ORIG_SUFFIX ) + 1 );
259+ if (!backup ) {
260+ WARN_GLIBC ("malloc" );
261+ goto print ;
262+ }
263+
264+ strcpy (backup , objname );
265+ strcat (backup , ORIG_SUFFIX );
266+ if (copy_file (objname , backup )) {
267+ backup = NULL ;
268+ goto print ;
269+ }
270+
271+ print :
272+ /*
273+ * Print the cmdline args to make it easier to recreate. If '--output'
274+ * wasn't used, add it to the printed args with the backup as input.
275+ */
276+ fprintf (stderr , "%s" , orig_argv [0 ]);
277+
278+ for (int i = 1 ; i < orig_argc ; i ++ ) {
279+ char * arg = orig_argv [i ];
280+
281+ if (backup && !strcmp (arg , objname ))
282+ fprintf (stderr , " %s -o %s" , backup , objname );
283+ else
284+ fprintf (stderr , " %s" , arg );
285+ }
286+
287+ fprintf (stderr , "\n" );
288+ }
249289
250290int objtool_run (int argc , const char * * argv )
251291{
252292 struct objtool_file * file ;
253- char * backup = NULL ;
254- char * * orig_argv ;
255293 int ret = 0 ;
256294
257- orig_argv = save_argv (argc , argv );
258- if (!orig_argv )
259- return 1 ;
295+ orig_argc = argc ;
296+ save_argv (argc , argv );
260297
261298 cmd_parse_options (argc , argv , check_usage );
262299
@@ -279,59 +316,19 @@ int objtool_run(int argc, const char **argv)
279316
280317 file = objtool_open_read (objname );
281318 if (!file )
282- goto err ;
319+ return 1 ;
283320
284321 if (!opts .link && has_multiple_files (file -> elf )) {
285322 WARN ("Linked object requires --link" );
286- goto err ;
323+ return 1 ;
287324 }
288325
289326 ret = check (file );
290327 if (ret )
291- goto err ;
328+ return ret ;
292329
293330 if (!opts .dryrun && file -> elf -> changed && elf_write (file -> elf ))
294- goto err ;
295-
296- return 0 ;
297-
298- err :
299- if (opts .dryrun )
300- goto err_msg ;
301-
302- if (opts .output ) {
303- unlink (opts .output );
304- goto err_msg ;
305- }
306-
307- /*
308- * Make a backup before kbuild deletes the file so the error
309- * can be recreated without recompiling or relinking.
310- */
311- backup = malloc (strlen (objname ) + strlen (ORIG_SUFFIX ) + 1 );
312- if (!backup ) {
313- WARN_GLIBC ("malloc" );
314331 return 1 ;
315- }
316-
317- strcpy (backup , objname );
318- strcat (backup , ORIG_SUFFIX );
319- if (copy_file (objname , backup ))
320- return 1 ;
321-
322- err_msg :
323- fprintf (stderr , "%s" , orig_argv [0 ]);
324-
325- for (int i = 1 ; i < argc ; i ++ ) {
326- char * arg = orig_argv [i ];
327332
328- if (backup && !strcmp (arg , objname ))
329- fprintf (stderr , " %s -o %s" , backup , objname );
330- else
331- fprintf (stderr , " %s" , arg );
332- }
333-
334- fprintf (stderr , "\n" );
335-
336- return 1 ;
333+ return 0 ;
337334}
0 commit comments