Skip to content

Commit

Permalink
kbuild: in the section mismatch check try harder to find symbols
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
Sam Ravnborg committed Mar 5, 2006
1 parent e835a39 commit 43c74d1
Showing 1 changed file with 16 additions and 1 deletion.
17 changes: 16 additions & 1 deletion scripts/mod/modpost.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -587,13 +590,25 @@ 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
{
if ((sym->st_value - addr) < afterdiff) {
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;
}
}
}
}
Expand Down

0 comments on commit 43c74d1

Please sign in to comment.