From cb0475ad52973207e36f0cb89023e4889b59dda0 Mon Sep 17 00:00:00 2001 From: Sam Ravnborg Date: Fri, 18 Jan 2008 21:04:34 +0100 Subject: [PATCH] --- yaml --- r: 77987 b: refs/heads/master c: 9ad21c3f3ecffeb56be7b35030d7ec2f30b6fe11 h: refs/heads/master i: 77985: 8969303eeb9b2626c4789beac644fde7716b1d74 77983: 04f2b312c91fe68ea4db5ea9ce1dde3db3871eea v: v3 --- [refs] | 2 +- trunk/scripts/mod/modpost.c | 19 +++++++++++++++++-- trunk/scripts/mod/modpost.h | 2 ++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 79747be92e4f..e98d56786546 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d1f25e6658943569f2713dfde1b9d74e2f6c7243 +refs/heads/master: 9ad21c3f3ecffeb56be7b35030d7ec2f30b6fe11 diff --git a/trunk/scripts/mod/modpost.c b/trunk/scripts/mod/modpost.c index 46660a4f9e22..902ee55f327f 100644 --- a/trunk/scripts/mod/modpost.c +++ b/trunk/scripts/mod/modpost.c @@ -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) diff --git a/trunk/scripts/mod/modpost.h b/trunk/scripts/mod/modpost.h index 0ffed17ec20c..999f15e0e008 100644 --- a/trunk/scripts/mod/modpost.h +++ b/trunk/scripts/mod/modpost.h @@ -17,6 +17,7 @@ #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 @@ -31,6 +32,7 @@ #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