Re: livepatch: reuse module loader code to write relocations
From: Jessica Yu <hidden>
Date: 2016-03-21 18:07:49
Also in:
linux-s390, lkml
+++ Josh Poimboeuf [21/03/16 12:36 -0500]:On Mon, Mar 21, 2016 at 11:46:51AM -0500, Josh Poimboeuf wrote:quoted
On Mon, Mar 21, 2016 at 05:31:57PM +0100, Petr Mladek wrote:quoted
quoted
diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c index 780f00c..2aa20fa 100644 --- a/kernel/livepatch/core.c +++ b/kernel/livepatch/core.c +static int klp_resolve_symbols(Elf_Shdr *relasec, struct module *pmod) +{ + int i, cnt, vmlinux, ret; + struct klp_buf bufs = {0}; + Elf_Rela *relas; + Elf_Sym *sym; + char *symname; + unsigned long sympos; + + relas = (Elf_Rela *) relasec->sh_addr; + /* For each rela in this klp relocation section */ + for (i = 0; i < relasec->sh_size / sizeof(Elf_Rela); i++) { + sym = pmod->core_kallsyms.symtab + ELF_R_SYM(relas[i].r_info); + if (sym->st_shndx != SHN_LIVEPATCH) + return -EINVAL; + + klp_clear_buf(&bufs); + + /* Format: .klp.sym.objname.symbol_name,sympos */ + symname = pmod->core_kallsyms.strtab + sym->st_name; + cnt = sscanf(symname, ".klp.sym.%64[^.].%128[^,],%lu", + bufs.objname, bufs.symname, &sympos);Note that MODULE_NAME_LEN even is not 64. It is defined by: #define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long)) I strongly suggest to use the proposal from Josh.Hm, looks like my suggestion to use __stringify(MODULE_NAME_LEN) doesn't work. It results in the string "MODULE_NAME_LEN". Which surprises me: isn't is supposed to resolve the macro before applying the '#' operation to it?Turns out I hadn't included module.h. When I do so, __stringify(MODULE_NAME_LEN) becomes "(64 - sizeof(unsigned long))". Which is still not going to work :-/
Hm, we probably won't be able to make use of preprocessor tricks here, since I don't think the preprocessor can even evaluate that expression (esp. with that sizeof there). This might mean building the format string at runtime, which may be more trouble than it's worth...
quoted
I was going to suggest another idea: hard-code it at 63 and then do something like BUILD_BUG_ON(MODULE_NAME_LEN != 64) But you're right... it's not even 64! Need to think on this some more...-- Josh