aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/mod
diff options
context:
space:
mode:
authorSam Ravnborg <sam@mars.ravnborg.org>2006-03-05 06:02:46 -0500
committerSam Ravnborg <sam@mars.ravnborg.org>2006-03-05 06:02:46 -0500
commit43c74d179596ba1f8eceb8c6a5c7e11afe233662 (patch)
tree09f7fcee82d8a464706b77e171956cc23661baf4 /scripts/mod
parente835a39c1c1f023ef443f735b0e98b08660ae0e4 (diff)
kbuild: in the section mismatch check try harder to find symbols
When searching for symbols the only check performed was if offset equals st_value. Adding an additional check to see if st_name points t a valid name made us sort out a few more false positives and let us report more correct names in warnings. Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Diffstat (limited to 'scripts/mod')
-rw-r--r--scripts/mod/modpost.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 3b570b18c2e4..3648683a26c5 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -558,7 +558,10 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf_Addr addr,
558} 558}
559 559
560/* 560/*
561 * Find symbols before or equal addr and after addr - in the section sec 561 * Find symbols before or equal addr and after addr - in the section sec.
562 * If we find two symbols with equal offset prefer one with a valid name.
563 * The ELF format may have a better way to detect what type of symbol
564 * it is, but this works for now.
562 **/ 565 **/
563static void find_symbols_between(struct elf_info *elf, Elf_Addr addr, 566static void find_symbols_between(struct elf_info *elf, Elf_Addr addr,
564 const char *sec, 567 const char *sec,
@@ -587,6 +590,12 @@ static void find_symbols_between(struct elf_info *elf, Elf_Addr addr,
587 beforediff = addr - sym->st_value; 590 beforediff = addr - sym->st_value;
588 *before = sym; 591 *before = sym;
589 } 592 }
593 else if ((addr - sym->st_value) == beforediff) {
594 /* equal offset, valid name? */
595 const char *name = elf->strtab + sym->st_name;
596 if (name && strlen(name))
597 *before = sym;
598 }
590 } 599 }
591 else 600 else
592 { 601 {
@@ -594,6 +603,12 @@ static void find_symbols_between(struct elf_info *elf, Elf_Addr addr,
594 afterdiff = sym->st_value - addr; 603 afterdiff = sym->st_value - addr;
595 *after = sym; 604 *after = sym;
596 } 605 }
606 else if ((sym->st_value - addr) == afterdiff) {
607 /* equal offset, valid name? */
608 const char *name = elf->strtab + sym->st_name;
609 if (name && strlen(name))
610 *after = sym;
611 }
597 } 612 }
598 } 613 }
599} 614}