Browse Source

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>
Sam Ravnborg 19 years ago
parent
commit
43c74d1795
1 changed files with 16 additions and 1 deletions
  1. 16 1
      scripts/mod/modpost.c

+ 16 - 1
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;
+			}
 		}
 	}
 }