kbuild: in the section mismatch check try harder to find symbols
authorSam Ravnborg <sam@mars.ravnborg.org>
Sun, 5 Mar 2006 11:02:46 +0000 (12:02 +0100)
committerSam Ravnborg <sam@mars.ravnborg.org>
Sun, 5 Mar 2006 11:02:46 +0000 (12:02 +0100)
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>
scripts/mod/modpost.c

index 3b570b18c2e41bbd79e2de237db9ad9f09cd6959..3648683a26c53031d11e9cdd46373b2b886c883e 100644 (file)
@@ -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;
+                       }
                }
        }
 }