diff options
Diffstat (limited to 'scripts/mod/modpost.c')
-rw-r--r-- | scripts/mod/modpost.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 46660a4f9e22..902ee55f327f 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
@@ -776,10 +776,13 @@ static int secref_whitelist(const char *modname, const char *tosec, | |||
776 | * In other cases the symbol needs to be looked up in the symbol table | 776 | * In other cases the symbol needs to be looked up in the symbol table |
777 | * based on section and address. | 777 | * based on section and address. |
778 | * **/ | 778 | * **/ |
779 | static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf_Addr addr, | 779 | static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr, |
780 | Elf_Sym *relsym) | 780 | Elf_Sym *relsym) |
781 | { | 781 | { |
782 | Elf_Sym *sym; | 782 | Elf_Sym *sym; |
783 | Elf_Sym *near = NULL; | ||
784 | Elf64_Sword distance = 20; | ||
785 | Elf64_Sword d; | ||
783 | 786 | ||
784 | if (relsym->st_name != 0) | 787 | if (relsym->st_name != 0) |
785 | return relsym; | 788 | return relsym; |
@@ -790,8 +793,20 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf_Addr addr, | |||
790 | continue; | 793 | continue; |
791 | if (sym->st_value == addr) | 794 | if (sym->st_value == addr) |
792 | return sym; | 795 | return sym; |
796 | /* Find a symbol nearby - addr are maybe negative */ | ||
797 | d = sym->st_value - addr; | ||
798 | if (d < 0) | ||
799 | d = addr - sym->st_value; | ||
800 | if (d < distance) { | ||
801 | distance = d; | ||
802 | near = sym; | ||
803 | } | ||
793 | } | 804 | } |
794 | return NULL; | 805 | /* We need a close match */ |
806 | if (distance < 20) | ||
807 | return near; | ||
808 | else | ||
809 | return NULL; | ||
795 | } | 810 | } |
796 | 811 | ||
797 | static inline int is_arm_mapping_symbol(const char *str) | 812 | static inline int is_arm_mapping_symbol(const char *str) |