mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 11:06:41 -05:00
x86/module: Improve relocation error messages
Add the section number and reloc index to relocation error messages to help find the faulty relocation. Acked-by: Petr Mladek <pmladek@suse.com> Tested-by: Joe Lawrence <joe.lawrence@redhat.com> Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
This commit is contained in:
@@ -97,6 +97,7 @@ static int __write_relocate_add(Elf64_Shdr *sechdrs,
|
||||
DEBUGP("%s relocate section %u to %u\n",
|
||||
apply ? "Applying" : "Clearing",
|
||||
relsec, sechdrs[relsec].sh_info);
|
||||
|
||||
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
|
||||
size_t size;
|
||||
|
||||
@@ -162,15 +163,17 @@ static int __write_relocate_add(Elf64_Shdr *sechdrs,
|
||||
|
||||
if (apply) {
|
||||
if (memcmp(loc, &zero, size)) {
|
||||
pr_err("x86/modules: Invalid relocation target, existing value is nonzero for type %d, loc %p, val %Lx\n",
|
||||
(int)ELF64_R_TYPE(rel[i].r_info), loc, val);
|
||||
pr_err("x86/modules: Invalid relocation target, existing value is nonzero for sec %u, idx %u, type %d, loc %lx, val %llx\n",
|
||||
relsec, i, (int)ELF64_R_TYPE(rel[i].r_info),
|
||||
(unsigned long)loc, val);
|
||||
return -ENOEXEC;
|
||||
}
|
||||
write(loc, &val, size);
|
||||
} else {
|
||||
if (memcmp(loc, &val, size)) {
|
||||
pr_warn("x86/modules: Invalid relocation target, existing value does not match expected value for type %d, loc %p, val %Lx\n",
|
||||
(int)ELF64_R_TYPE(rel[i].r_info), loc, val);
|
||||
pr_warn("x86/modules: Invalid relocation target, existing value does not match expected value for sec %u, idx %u, type %d, loc %lx, val %llx\n",
|
||||
relsec, i, (int)ELF64_R_TYPE(rel[i].r_info),
|
||||
(unsigned long)loc, val);
|
||||
return -ENOEXEC;
|
||||
}
|
||||
write(loc, &zero, size);
|
||||
@@ -179,8 +182,8 @@ static int __write_relocate_add(Elf64_Shdr *sechdrs,
|
||||
return 0;
|
||||
|
||||
overflow:
|
||||
pr_err("overflow in relocation type %d val %Lx\n",
|
||||
(int)ELF64_R_TYPE(rel[i].r_info), val);
|
||||
pr_err("overflow in relocation type %d val %llx sec %u idx %d\n",
|
||||
(int)ELF64_R_TYPE(rel[i].r_info), val, relsec, i);
|
||||
pr_err("`%s' likely not compiled with -mcmodel=kernel\n",
|
||||
me->name);
|
||||
return -ENOEXEC;
|
||||
|
||||
@@ -217,8 +217,8 @@ static int klp_resolve_symbols(Elf_Shdr *sechdrs, const char *strtab,
|
||||
for (i = 0; i < relasec->sh_size / sizeof(Elf_Rela); i++) {
|
||||
sym = (Elf_Sym *)sechdrs[symndx].sh_addr + ELF_R_SYM(relas[i].r_info);
|
||||
if (sym->st_shndx != SHN_LIVEPATCH) {
|
||||
pr_err("symbol %s is not marked as a livepatch symbol\n",
|
||||
strtab + sym->st_name);
|
||||
pr_err("symbol %s at rela sec %u idx %d is not marked as a livepatch symbol\n",
|
||||
strtab + sym->st_name, symndx, i);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user