diff options
author | Sam Ravnborg <sam@ravnborg.org> | 2008-01-18 15:04:34 -0500 |
---|---|---|
committer | Sam Ravnborg <sam@ravnborg.org> | 2008-01-28 17:14:40 -0500 |
commit | 9ad21c3f3ecffeb56be7b35030d7ec2f30b6fe11 (patch) | |
tree | b13cef078ebe25ddfca57f64404a664440713672 /scripts/mod/modpost.c | |
parent | d1f25e6658943569f2713dfde1b9d74e2f6c7243 (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.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) |