mirror of https://gitee.com/openkylin/linux.git
kbuild: in the section mismatch check try harder to find symbols
When searching for symbols the only check performed was if offset equals st_value. Adding an additional check to see if st_name points t a valid name made us sort out a few more false positives and let us report more correct names in warnings. Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
This commit is contained in:
parent
e835a39c1c
commit
43c74d1795
|
@ -558,7 +558,10 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf_Addr addr,
|
|||
}
|
||||
|
||||
/*
|
||||
* Find symbols before or equal addr and after addr - in the section sec
|
||||
* Find symbols before or equal addr and after addr - in the section sec.
|
||||
* If we find two symbols with equal offset prefer one with a valid name.
|
||||
* The ELF format may have a better way to detect what type of symbol
|
||||
* it is, but this works for now.
|
||||
**/
|
||||
static void find_symbols_between(struct elf_info *elf, Elf_Addr addr,
|
||||
const char *sec,
|
||||
|
@ -587,6 +590,12 @@ static void find_symbols_between(struct elf_info *elf, Elf_Addr addr,
|
|||
beforediff = addr - sym->st_value;
|
||||
*before = sym;
|
||||
}
|
||||
else if ((addr - sym->st_value) == beforediff) {
|
||||
/* equal offset, valid name? */
|
||||
const char *name = elf->strtab + sym->st_name;
|
||||
if (name && strlen(name))
|
||||
*before = sym;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -594,6 +603,12 @@ static void find_symbols_between(struct elf_info *elf, Elf_Addr addr,
|
|||
afterdiff = sym->st_value - addr;
|
||||
*after = sym;
|
||||
}
|
||||
else if ((sym->st_value - addr) == afterdiff) {
|
||||
/* equal offset, valid name? */
|
||||
const char *name = elf->strtab + sym->st_name;
|
||||
if (name && strlen(name))
|
||||
*after = sym;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue