@@ -1663,6 +1663,28 @@ static int kpatch_include_hook_elements(struct kpatch_elf *kelf)
return num_new_functions;
}
+static unsigned int include_special_sections(const struct kpatch_elf *kelf)
+{
+ const struct section *sec;
+ unsigned int nr = 0;
+
+ /*
+ * Only account for changes in alternatives and exception table related
+ * sections. Hooks are already taken care of separately, and changes
+ * in bug_frame sections always go along with changes in the caller
+ * functions.
+ */
+ list_for_each_entry(sec, &kelf->sections, list)
+ if (sec->status != SAME &&
+ (!strcmp(sec->name, ".altinstructions") ||
+ !strcmp(sec->name, ".altinstr_replacement") ||
+ !strcmp(sec->name, ".ex_table") ||
+ !strcmp(sec->name, ".fixup")))
+ nr++;
+
+ return nr;
+}
+
static int kpatch_include_new_globals(struct kpatch_elf *kelf)
{
struct symbol *sym;
@@ -2469,6 +2491,8 @@ int main(int argc, char *argv[])
kpatch_include_debug_sections(kelf_patched);
log_debug("Include hook elements\n");
num_changed += kpatch_include_hook_elements(kelf_patched);
+ log_debug("Include special sections\n");
+ num_changed += include_special_sections(kelf_patched);
log_debug("num_changed = %d\n", num_changed);
log_debug("Include new globals\n");
new_globals_exist = kpatch_include_new_globals(kelf_patched);
When deciding whether there's content to generate a payload also take into account whether special sections have changed. Initially account for changes to alternative related section to cause the generation of a livepatch. Note that accounting for hook sections is already done by kpatch_include_hook_elements() when deciding whether there's changed content in the object file. .bugframe sections are also not accounted for since any section in a bugframe section will be accompanied by a change in the function the bugframe references (the placement of the BUG_INSTR will change in the caller function). Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> --- create-diff-object.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)