mirror of https://github.com/dynup/kpatch
lookup: add duplicate symbol checks
Add checks for duplicate symbols, and refactor the logic slightly. Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
This commit is contained in:
parent
3064cf3c60
commit
ae9f1c17b1
|
@ -404,7 +404,7 @@ bool lookup_local_symbol(struct lookup_table *table, char *name,
|
||||||
{
|
{
|
||||||
struct object_symbol *sym;
|
struct object_symbol *sym;
|
||||||
unsigned long sympos = 0;
|
unsigned long sympos = 0;
|
||||||
int i, match = 0, in_file = 0;
|
int i, in_file = 0;
|
||||||
|
|
||||||
if (!table->local_syms)
|
if (!table->local_syms)
|
||||||
return false;
|
return false;
|
||||||
|
@ -426,19 +426,18 @@ bool lookup_local_symbol(struct lookup_table *table, char *name,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (sym->bind == STB_LOCAL && !strcmp(sym->name, name)) {
|
if (sym->bind == STB_LOCAL && !strcmp(sym->name, name)) {
|
||||||
match = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!match)
|
if (result->objname)
|
||||||
return false;
|
ERROR("duplicate local symbol found for %s", name);
|
||||||
|
|
||||||
result->objname = table->objname;
|
result->objname = table->objname;
|
||||||
result->sympos = sympos;
|
|
||||||
result->addr = sym->addr;
|
result->addr = sym->addr;
|
||||||
result->size = sym->size;
|
result->size = sym->size;
|
||||||
return true;
|
result->sympos = sympos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return !!result->objname;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool lookup_global_symbol(struct lookup_table *table, char *name,
|
bool lookup_global_symbol(struct lookup_table *table, char *name,
|
||||||
|
@ -451,15 +450,18 @@ bool lookup_global_symbol(struct lookup_table *table, char *name,
|
||||||
for_each_obj_symbol(i, sym, table) {
|
for_each_obj_symbol(i, sym, table) {
|
||||||
if ((sym->bind == STB_GLOBAL || sym->bind == STB_WEAK) &&
|
if ((sym->bind == STB_GLOBAL || sym->bind == STB_WEAK) &&
|
||||||
!strcmp(sym->name, name)) {
|
!strcmp(sym->name, name)) {
|
||||||
|
|
||||||
|
if (result->objname)
|
||||||
|
ERROR("duplicate global symbol found for %s", name);
|
||||||
|
|
||||||
result->objname = table->objname;
|
result->objname = table->objname;
|
||||||
result->addr = sym->addr;
|
result->addr = sym->addr;
|
||||||
result->size = sym->size;
|
result->size = sym->size;
|
||||||
result->sympos = 0; /* always 0 for global symbols */
|
result->sympos = 0; /* always 0 for global symbols */
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return !!result->objname;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool lookup_is_exported_symbol(struct lookup_table *table, char *name)
|
bool lookup_is_exported_symbol(struct lookup_table *table, char *name)
|
||||||
|
|
Loading…
Reference in New Issue