kbuild: try harder to find symbol names in modpost
[safe/jmp/linux-2.6] / scripts / mod / modpost.c
index 46660a4..902ee55 100644 (file)
@@ -776,10 +776,13 @@ static int secref_whitelist(const char *modname, const char *tosec,
  * In other cases the symbol needs to be looked up in the symbol table
  * based on section and address.
  *  **/
-static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf_Addr addr,
+static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
                                Elf_Sym *relsym)
 {
        Elf_Sym *sym;
+       Elf_Sym *near = NULL;
+       Elf64_Sword distance = 20;
+       Elf64_Sword d;
 
        if (relsym->st_name != 0)
                return relsym;
@@ -790,8 +793,20 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf_Addr addr,
                        continue;
                if (sym->st_value == addr)
                        return sym;
+               /* Find a symbol nearby - addr are maybe negative */
+               d = sym->st_value - addr;
+               if (d < 0)
+                       d = addr - sym->st_value;
+               if (d < distance) {
+                       distance = d;
+                       near = sym;
+               }
        }
-       return NULL;
+       /* We need a close match */
+       if (distance < 20)
+               return near;
+       else
+               return NULL;
 }
 
 static inline int is_arm_mapping_symbol(const char *str)