From 7d85b9f5a9573fa92f2521829710c726f3cb3842 Mon Sep 17 00:00:00 2001 From: Sam Ravnborg Date: Sun, 5 Mar 2006 12:02:46 +0100 Subject: [PATCH] --- yaml --- r: 23725 b: refs/heads/master c: 43c74d179596ba1f8eceb8c6a5c7e11afe233662 h: refs/heads/master i: 23723: 7cab4a0f91318f4e14f00ee5b93d622004d8510e v: v3 --- [refs] | 2 +- trunk/scripts/mod/modpost.c | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index d54f0c9544a8..c55b7509922a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e835a39c1c1f023ef443f735b0e98b08660ae0e4 +refs/heads/master: 43c74d179596ba1f8eceb8c6a5c7e11afe233662 diff --git a/trunk/scripts/mod/modpost.c b/trunk/scripts/mod/modpost.c index 3b570b18c2e4..3648683a26c5 100644 --- a/trunk/scripts/mod/modpost.c +++ b/trunk/scripts/mod/modpost.c @@ -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; + } } } }