fix the mangled function strcmp

Fix the mangled function strcmp so that it compares all of the string
except for the numbered parts.  foo.isra.35 should match foo.isra.1, but
not foo.isra.35.part.36.

Fixes #352.
This commit is contained in:
Josh Poimboeuf 2014-09-10 20:22:27 -05:00
parent c21cc1292f
commit 0da57e8807
2 changed files with 48 additions and 22 deletions

View File

@ -236,19 +236,6 @@ struct symbol *find_symbol_by_name(struct list_head *list, const char *name)
return NULL; return NULL;
} }
struct symbol *find_symbol_by_name_prefix(struct list_head *list,
const char *name)
{
struct symbol *sym;
int namelen = strlen(name);
list_for_each_entry(sym, list, list)
if (!strncmp(sym->name, name, namelen))
return sym;
return NULL;
}
#define ALLOC_LINK(_new, _list) \ #define ALLOC_LINK(_new, _list) \
{ \ { \
(_new) = malloc(sizeof(*(_new))); \ (_new) = malloc(sizeof(*(_new))); \
@ -785,6 +772,30 @@ void kpatch_mark_grouped_sections(struct kpatch_elf *kelf)
} }
} }
/*
* This is like strcmp, but for gcc-mangled function names. It skips the
* comparison of any substring which consists of '.' followed by any number of
* digits.
*/
static int kpatch_mangled_strcmp(char *s1, char *s2)
{
while (*s1 == *s2) {
if (!*s1)
return 0;
if (*s1 == '.' && isdigit(s1[1])) {
if (!isdigit(s2[1]))
return 1;
while (isdigit(*++s1))
;
while (isdigit(*++s2))
;
} else {
s1++;
s2++;
}
}
return 1;
}
/* /*
* When gcc makes compiler optimizations which affect a function's calling * When gcc makes compiler optimizations which affect a function's calling
@ -798,8 +809,9 @@ void kpatch_rename_mangled_functions(struct kpatch_elf *base,
struct kpatch_elf *patched) struct kpatch_elf *patched)
{ {
struct symbol *sym, *basesym; struct symbol *sym, *basesym;
char *prefix, *dot, name[256], *origname; char name[256], *origname;
struct section *sec, *basesec; struct section *sec, *basesec;
int found;
list_for_each_entry(sym, &patched->symbols, list) { list_for_each_entry(sym, &patched->symbols, list) {
if (sym->type != STT_FUNC) if (sym->type != STT_FUNC)
@ -810,15 +822,15 @@ void kpatch_rename_mangled_functions(struct kpatch_elf *base,
!strstr(sym->name, ".part.")) !strstr(sym->name, ".part."))
continue; continue;
/* prefix of foo.isra.1.constprop.2 is foo.isra */ found = 0;
prefix = strdup(sym->name); list_for_each_entry(basesym, &base->symbols, list) {
dot = strchr(prefix, '.'); if (!kpatch_mangled_strcmp(basesym->name, sym->name)) {
dot = strchr(dot+1, '.'); found = 1;
*dot = '\0'; break;
}
}
basesym = find_symbol_by_name_prefix(&base->symbols, prefix); if (!found)
free(prefix);
if (!basesym)
continue; continue;
if (!strcmp(sym->name, basesym->name)) if (!strcmp(sym->name, basesym->name))

View File

@ -0,0 +1,14 @@
Index: src/mm/slub.c
===================================================================
--- src.orig/mm/slub.c
+++ src/mm/slub.c
@@ -5346,6 +5346,9 @@ void get_slabinfo(struct kmem_cache *s,
unsigned long nr_free = 0;
int node;
+ if (!jiffies)
+ printk("slabinfo\n");
+
for_each_online_node(node) {
struct kmem_cache_node *n = get_node(s, node);