Commit da68d61f89e275260cc993a0d4a39e63700098fb
Committed by
Linus Torvalds
1 parent
3deac046e2
Exists in
master
and in
4 other branches
[PATCH] remove modpost false warnings on ARM
This patch stops "modpost" from issuing erroneous modpost warnings on ARM builds, which it's been doing since since maybe last summer. A canonical example would be driver method table entries: WARNING: <path> - Section mismatch: reference to .exit.text:<name>_remove from .data after '$d' (at offset 0x4) That "$d" symbol is generated by tools conformant with ARM ABI specs; in this case it's a symbol **in the middle of** a "<name>_driver" struct. The erroneous warnings appear to be issued because "modpost" whitelists references from "<name>_driver" data into init and exit sections ... but doesn't know should also include those "$d" mapping symbols, which are not otherwise associated with "<name>_driver" symbols. This patch prevents the modpost symbol lookup code from ever returning those mapping symbols, so it will return a whitelisted symbol instead. Then things work as expected. Now to revert various code-bloating "fixes" that got merged because of this modpost bug.... Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Acked-by: Rusty Russell <rusty@rustcorp.com.au> Cc: Roman Zippel <zippel@linux-m68k.org> Acked-by: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 28 additions and 8 deletions Side-by-side Diff
scripts/mod/modpost.c
... | ... | @@ -686,7 +686,31 @@ |
686 | 686 | return NULL; |
687 | 687 | } |
688 | 688 | |
689 | +static inline int is_arm_mapping_symbol(const char *str) | |
690 | +{ | |
691 | + return str[0] == '$' && strchr("atd", str[1]) | |
692 | + && (str[2] == '\0' || str[2] == '.'); | |
693 | +} | |
694 | + | |
689 | 695 | /* |
696 | + * If there's no name there, ignore it; likewise, ignore it if it's | |
697 | + * one of the magic symbols emitted used by current ARM tools. | |
698 | + * | |
699 | + * Otherwise if find_symbols_between() returns those symbols, they'll | |
700 | + * fail the whitelist tests and cause lots of false alarms ... fixable | |
701 | + * only by merging __exit and __init sections into __text, bloating | |
702 | + * the kernel (which is especially evil on embedded platforms). | |
703 | + */ | |
704 | +static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym) | |
705 | +{ | |
706 | + const char *name = elf->strtab + sym->st_name; | |
707 | + | |
708 | + if (!name || !strlen(name)) | |
709 | + return 0; | |
710 | + return !is_arm_mapping_symbol(name); | |
711 | +} | |
712 | + | |
713 | +/* | |
690 | 714 | * Find symbols before or equal addr and after addr - in the section sec. |
691 | 715 | * If we find two symbols with equal offset prefer one with a valid name. |
692 | 716 | * The ELF format may have a better way to detect what type of symbol |
693 | 717 | |
... | ... | @@ -714,16 +738,15 @@ |
714 | 738 | symsec = secstrings + elf->sechdrs[sym->st_shndx].sh_name; |
715 | 739 | if (strcmp(symsec, sec) != 0) |
716 | 740 | continue; |
741 | + if (!is_valid_name(elf, sym)) | |
742 | + continue; | |
717 | 743 | if (sym->st_value <= addr) { |
718 | 744 | if ((addr - sym->st_value) < beforediff) { |
719 | 745 | beforediff = addr - sym->st_value; |
720 | 746 | *before = sym; |
721 | 747 | } |
722 | 748 | else if ((addr - sym->st_value) == beforediff) { |
723 | - /* equal offset, valid name? */ | |
724 | - const char *name = elf->strtab + sym->st_name; | |
725 | - if (name && strlen(name)) | |
726 | - *before = sym; | |
749 | + *before = sym; | |
727 | 750 | } |
728 | 751 | } |
729 | 752 | else |
... | ... | @@ -733,10 +756,7 @@ |
733 | 756 | *after = sym; |
734 | 757 | } |
735 | 758 | else if ((sym->st_value - addr) == afterdiff) { |
736 | - /* equal offset, valid name? */ | |
737 | - const char *name = elf->strtab + sym->st_name; | |
738 | - if (name && strlen(name)) | |
739 | - *after = sym; | |
759 | + *after = sym; | |
740 | 760 | } |
741 | 761 | } |
742 | 762 | } |