On Thu, Jun 05, 2025 at 09:32:46AM +0200, Peter Zijlstra wrote: > > But also, feel free to resurrect --backup, or you can yell at me to do > > it as the backup code changed a bit. > > I have the patch somewhere, failed to send it out. I'll try and dig it > out later today.
This is what I had. Wasn't sure we wanted to make -v imply --backup ? I'm used to stealing the objtool arguments from V=1 builds. I suppose the print_args thing is easier, might get used to it eventually. diff --git a/tools/objtool/builtin-check.c b/tools/objtool/builtin-check.c index 80239843e9f0..7d8f99cf9b0b 100644 --- a/tools/objtool/builtin-check.c +++ b/tools/objtool/builtin-check.c @@ -101,6 +101,7 @@ static const struct option check_options[] = { OPT_BOOLEAN(0, "stats", &opts.stats, "print statistics"), OPT_BOOLEAN('v', "verbose", &opts.verbose, "verbose warnings"), OPT_BOOLEAN(0, "Werror", &opts.werror, "return error on warnings"), + OPT_BOOLEAN(0, "backup", &opts.backup, "create a backup (.orig) file on error"), OPT_END(), }; @@ -244,13 +245,10 @@ static void save_argv(int argc, const char **argv) }; } -void print_args(void) +static void make_backup(void) { char *backup = NULL; - if (opts.output || opts.dryrun) - goto print; - /* * Make a backup before kbuild deletes the file so the error * can be recreated without recompiling or relinking. @@ -258,17 +256,19 @@ void print_args(void) backup = malloc(strlen(objname) + strlen(ORIG_SUFFIX) + 1); if (!backup) { ERROR_GLIBC("malloc"); - goto print; + return; } strcpy(backup, objname); strcat(backup, ORIG_SUFFIX); if (copy_file(objname, backup)) { backup = NULL; - goto print; + return; } +} -print: +void print_args(void) +{ /* * Print the cmdline args to make it easier to recreate. If '--output' * wasn't used, add it to the printed args with the backup as input. @@ -278,10 +278,7 @@ void print_args(void) for (int i = 1; i < orig_argc; i++) { char *arg = orig_argv[i]; - if (backup && !strcmp(arg, objname)) - fprintf(stderr, " %s -o %s", backup, objname); - else - fprintf(stderr, " %s", arg); + fprintf(stderr, " %s", arg); } fprintf(stderr, "\n"); @@ -324,8 +321,11 @@ int objtool_run(int argc, const char **argv) } ret = check(file); - if (ret) + if (ret) { + if (opts.backup) + make_backup(); return ret; + } if (!opts.dryrun && file->elf->changed && elf_write(file->elf)) return 1; diff --git a/tools/objtool/include/objtool/builtin.h b/tools/objtool/include/objtool/builtin.h index 6b08666fa69d..97c36fb1fe9a 100644 --- a/tools/objtool/include/objtool/builtin.h +++ b/tools/objtool/include/objtool/builtin.h @@ -39,6 +39,7 @@ struct opts { bool stats; bool verbose; bool werror; + bool backup; }; extern struct opts opts;