mirror of
https://github.com/dynup/kpatch
synced 2024-12-23 21:52:07 +00:00
Merge pull request #323 from spartacus06/ignore-funcs-v2
add support for manually ignore functions
This commit is contained in:
commit
77c8700888
@ -17,6 +17,17 @@ struct kpatch_unload {
|
||||
char *objname; /* filled in by create-diff-object */
|
||||
};
|
||||
|
||||
/*
|
||||
* KPATCH_IGNORE_FUNCTION macro
|
||||
*
|
||||
* This macro is for ignoring functions that may change as a side effect of a
|
||||
* change in another function. The WARN class of macros, for example, embed
|
||||
* the line number in an instruction, which will cause the function to be
|
||||
* detected as changed when, in fact, there has been no functional change.
|
||||
*/
|
||||
#define KPATCH_IGNORE_FUNCTION(_fn) \
|
||||
void *__kpatch_ignore_func_##_fn __section(.kpatch.ignore.funcs) = _fn;
|
||||
|
||||
/*
|
||||
* KPATCH_LOAD_HOOK macro
|
||||
*
|
||||
|
@ -1376,6 +1376,32 @@ void kpatch_include_debug_sections(struct kpatch_elf *kelf)
|
||||
}
|
||||
}
|
||||
|
||||
void kpatch_mark_ignored_funcs_same(struct kpatch_elf *kelf)
|
||||
{
|
||||
struct section *sec;
|
||||
struct rela *rela;
|
||||
|
||||
sec = find_section_by_name(&kelf->sections, ".kpatch.ignore.funcs");
|
||||
if (!sec)
|
||||
return;
|
||||
|
||||
list_for_each_entry(rela, &sec->rela->relas, list) {
|
||||
if (!rela->sym->sec)
|
||||
ERROR("expected bundled symbol");
|
||||
if (rela->sym->type != STT_FUNC)
|
||||
ERROR("expected function symbol");
|
||||
log_normal("ignoring function %s\n", rela->sym->name);
|
||||
if (rela->sym->status != CHANGED)
|
||||
log_normal("NOTICE: no change detected in function %s, unnecessary KPATCH_IGNORE_FUNC()?\n", rela->sym->name);
|
||||
rela->sym->status = SAME;
|
||||
rela->sym->sec->status = SAME;
|
||||
if (rela->sym->sec->secsym)
|
||||
rela->sym->sec->secsym->status = SAME;
|
||||
if (rela->sym->sec->rela)
|
||||
rela->sym->sec->rela->status = SAME;
|
||||
}
|
||||
}
|
||||
|
||||
void kpatch_process_special_sections(struct kpatch_elf *kelf)
|
||||
{
|
||||
struct special_section *special;
|
||||
@ -2306,6 +2332,7 @@ int main(int argc, char *argv[])
|
||||
* in vmlinux can be linked to.
|
||||
*/
|
||||
kpatch_replace_sections_syms(kelf_patched);
|
||||
kpatch_mark_ignored_funcs_same(kelf_patched);
|
||||
|
||||
kpatch_process_special_sections(kelf_patched);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user