aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/mod/modpost.c
diff options
context:
space:
mode:
authorSam Ravnborg <sam@ravnborg.org>2008-01-18 15:04:34 -0500
committerSam Ravnborg <sam@ravnborg.org>2008-01-28 17:14:40 -0500
commit9ad21c3f3ecffeb56be7b35030d7ec2f30b6fe11 (patch)
treeb13cef078ebe25ddfca57f64404a664440713672 /scripts/mod/modpost.c
parentd1f25e6658943569f2713dfde1b9d74e2f6c7243 (diff)
kbuild: try harder to find symbol names in modpost
The relocation record sometimes contained an address which was not an exactly match for a symbol. Implment some simple logic such that if there is a symbol within 20 bytes of the address contained in the relocation record then print the name of this symbol. With this change modpost could find symbol names for the remaining .init.text symbols in my allyesconfig build for x86_64. Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Diffstat (limited to 'scripts/mod/modpost.c')
-rw-r--r--scripts/mod/modpost.c19
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 * **/
779static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf_Addr addr, 779static 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
797static inline int is_arm_mapping_symbol(const char *str) 812static inline int is_arm_mapping_symbol(const char *str)