* 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;
                        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)
 
 #define Elf_Shdr    Elf32_Shdr
 #define Elf_Sym     Elf32_Sym
 #define Elf_Addr    Elf32_Addr
+#define Elf_Sword   Elf64_Sword
 #define Elf_Section Elf32_Half
 #define ELF_ST_BIND ELF32_ST_BIND
 #define ELF_ST_TYPE ELF32_ST_TYPE
 #define Elf_Shdr    Elf64_Shdr
 #define Elf_Sym     Elf64_Sym
 #define Elf_Addr    Elf64_Addr
+#define Elf_Sword   Elf64_Sxword
 #define Elf_Section Elf64_Half
 #define ELF_ST_BIND ELF64_ST_BIND
 #define ELF_ST_TYPE ELF64_ST_TYPE