create-diff-object: better reachability error message

If a patch changes a single function which is in a special section that
we don't support, create-diff-object reports "no changed functions were
found".  Give a clearer error message in that case, by checking
reachability errors before unchanged errors and by printing all
reachability errors errors instead of the first one it encounters.

Fixes #150.
This commit is contained in:
Josh Poimboeuf 2014-04-29 10:49:58 -05:00
parent 9d476546ed
commit a397818257
1 changed files with 14 additions and 5 deletions

View File

@ -737,10 +737,16 @@ void kpatch_verify_patchability(struct kpatch_elf *kelf)
{ {
struct section *sec; struct section *sec;
int i; int i;
int errs = 0;
for_each_section(i, sec, &kelf->sections) for_each_section(i, sec, &kelf->sections)
if (sec->status == CHANGED && !sec->include) if (sec->status == CHANGED && !sec->include) {
DIFF_FATAL("changed section %s not selected for inclusion", sec->name); log_normal("%s: changed section %s not selected for inclusion\n",
objname, sec->name);
errs++;
}
if (errs)
DIFF_FATAL("%d unsupported section change(s)", errs);
} }
#define inc_printf(fmt, ...) \ #define inc_printf(fmt, ...) \
@ -1488,6 +1494,7 @@ int main(int argc, char *argv[])
struct kpatch_elf *kelf_base, *kelf_patched, *kelf_out; struct kpatch_elf *kelf_base, *kelf_patched, *kelf_out;
char *outfile; char *outfile;
struct arguments arguments; struct arguments arguments;
int num_changed;
arguments.debug = 0; arguments.debug = 0;
arguments.inventory = 0; arguments.inventory = 0;
@ -1529,12 +1536,14 @@ int main(int argc, char *argv[])
kpatch_regenerate_parainstructions_sections(kelf_patched); kpatch_regenerate_parainstructions_sections(kelf_patched);
kpatch_include_standard_sections(kelf_patched); kpatch_include_standard_sections(kelf_patched);
if (!kpatch_include_changed_functions(kelf_patched)) { num_changed = kpatch_include_changed_functions(kelf_patched);
kpatch_dump_kelf(kelf_patched);
kpatch_verify_patchability(kelf_patched);
if (!num_changed) {
log_normal("no changed functions were found\n"); log_normal("no changed functions were found\n");
return 3; /* 1 is ERROR, 2 is DIFF_FATAL */ return 3; /* 1 is ERROR, 2 is DIFF_FATAL */
} }
kpatch_dump_kelf(kelf_patched);
kpatch_verify_patchability(kelf_patched);
/* Generate the output elf */ /* Generate the output elf */
kpatch_generate_output(kelf_patched, &kelf_out); kpatch_generate_output(kelf_patched, &kelf_out);