aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
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
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')
-rw-r--r--scripts/mod/modpost.c19
-rw-r--r--scripts/mod/modpost.h2
2 files changed, 19 insertions, 2 deletions
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 46660a4f9e2..902ee55f327 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)
diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h
index 0ffed17ec20..999f15e0e00 100644
--- a/scripts/mod/modpost.h
+++ b/scripts/mod/modpost.h
@@ -17,6 +17,7 @@
17#define Elf_Shdr Elf32_Shdr 17#define Elf_Shdr Elf32_Shdr
18#define Elf_Sym Elf32_Sym 18#define Elf_Sym Elf32_Sym
19#define Elf_Addr Elf32_Addr 19#define Elf_Addr Elf32_Addr
20#define Elf_Sword Elf64_Sword
20#define Elf_Section Elf32_Half 21#define Elf_Section Elf32_Half
21#define ELF_ST_BIND ELF32_ST_BIND 22#define ELF_ST_BIND ELF32_ST_BIND
22#define ELF_ST_TYPE ELF32_ST_TYPE 23#define ELF_ST_TYPE ELF32_ST_TYPE
@@ -31,6 +32,7 @@
31#define Elf_Shdr Elf64_Shdr 32#define Elf_Shdr Elf64_Shdr
32#define Elf_Sym Elf64_Sym 33#define Elf_Sym Elf64_Sym
33#define Elf_Addr Elf64_Addr 34#define Elf_Addr Elf64_Addr
35#define Elf_Sword Elf64_Sxword
34#define Elf_Section Elf64_Half 36#define Elf_Section Elf64_Half
35#define ELF_ST_BIND ELF64_ST_BIND 37#define ELF_ST_BIND ELF64_ST_BIND
36#define ELF_ST_TYPE ELF64_ST_TYPE 38#define ELF_ST_TYPE ELF64_ST_TYPE