Thread (33 messages) flat view 33 messages, 6 authors, 2016-03-22

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help