Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

kbuild: simplified warning report in modpost

Refactor code so the warning report function
does nothing else than reporting warnings.
As a side effect some other code paths were cleaned
up by this.

Signed-off-by: Sam Ravnborg <sam@ravnborg.org>

+52 -52
+52 -52
scripts/mod/modpost.c
··· 607 607 608 608 static const char *sym_name(struct elf_info *elf, Elf_Sym *sym) 609 609 { 610 - return elf->strtab + sym->st_name; 610 + if (sym) 611 + return elf->strtab + sym->st_name; 612 + else 613 + return ""; 611 614 } 612 615 613 616 static const char *sec_name(struct elf_info *elf, int shndx) ··· 815 812 return 0; 816 813 } 817 814 818 - 819 815 /** 820 816 * Whitelist to allow certain references to pass with no warning. 821 817 * ··· 858 856 * refsymname = __init_begin, _sinittext, _einittext 859 857 * 860 858 **/ 861 - static int secref_whitelist(const char *modname, const char *tosec, 862 - const char *fromsec, const char *atsym, 863 - const char *refsymname) 859 + static int secref_whitelist(const char *fromsec, const char *fromsym, 860 + const char *tosec, const char *tosym) 864 861 { 865 862 /* Check for pattern 0 */ 866 863 if (match(fromsec, initref_sections)) 867 - return 1; 864 + return 0; 868 865 869 866 /* Check for pattern 1 */ 870 867 if (match(tosec, init_data_sections) && 871 868 match(fromsec, data_sections) && 872 - (strncmp(atsym, "__param", strlen("__param")) == 0)) 873 - return 1; 869 + (strncmp(fromsym, "__param", strlen("__param")) == 0)) 870 + return 0; 874 871 875 872 /* Check for pattern 2 */ 876 873 if (match(tosec, init_exit_sections) && 877 874 match(fromsec, data_sections) && 878 - match(atsym, symbol_white_list)) 879 - return 1; 875 + match(fromsym, symbol_white_list)) 876 + return 0; 880 877 881 878 /* Check for pattern 3 */ 882 879 if (match(fromsec, head_sections) && 883 880 match(tosec, init_sections)) 884 - return 1; 881 + return 0; 885 882 886 883 /* Check for pattern 4 */ 887 - if (match(refsymname, linker_symbols)) 888 - return 1; 884 + if (match(tosym, linker_symbols)) 885 + return 0; 889 886 890 - return 0; 887 + return 1; 891 888 } 892 889 893 890 /** ··· 988 987 return near; 989 988 } 990 989 991 - /** 990 + /* 992 991 * Print a warning about a section mismatch. 993 992 * Try to find symbols near it so user can find it. 994 993 * Check whitelist before warning - it may be a false positive. 995 - **/ 996 - static void warn_sec_mismatch(const char *modname, const char *fromsec, 997 - struct elf_info *elf, Elf_Sym *sym, Elf_Rela r) 994 + */ 995 + static void report_sec_mismatch(const char *modname, 996 + const char *fromsec, 997 + unsigned long long fromaddr, 998 + const char *fromsym, 999 + const char *tosec, const char *tosym) 998 1000 { 999 - Elf_Sym *where; 1000 - Elf_Sym *refsym; 1001 - const char *refsymname = ""; 1002 - const char *secname; 1003 - 1004 - secname = sec_name(elf, sym->st_shndx); 1005 - where = find_elf_symbol2(elf, r.r_offset, fromsec); 1006 - 1007 - refsym = find_elf_symbol(elf, r.r_addend, sym); 1008 - if (refsym && strlen(sym_name(elf, refsym))) 1009 - refsymname = sym_name(elf, refsym); 1010 - 1011 - /* check whitelist - we may ignore it */ 1012 - if (secref_whitelist(modname, secname, fromsec, 1013 - where ? sym_name(elf, where) : "", 1014 - refsymname)) 1015 - return; 1016 - 1017 - if (where) { 1001 + if (strlen(tosym)) { 1018 1002 warn("%s(%s+0x%llx): Section mismatch: reference to %s:%s " 1019 1003 "in '%s'\n", 1020 - modname, fromsec, (unsigned long long)r.r_offset, 1021 - secname, refsymname, sym_name(elf, where)); 1004 + modname, fromsec, fromaddr, 1005 + tosec, tosym, fromsym); 1022 1006 } else { 1023 1007 warn("%s(%s+0x%llx): Section mismatch: reference to %s:%s\n", 1024 - modname, fromsec, (unsigned long long)r.r_offset, 1025 - secname, refsymname); 1008 + modname, fromsec, fromaddr, 1009 + tosec, tosym); 1010 + } 1011 + } 1012 + 1013 + static void check_section_mismatch(const char *modname, struct elf_info *elf, 1014 + Elf_Rela *r, Elf_Sym *sym, const char *fromsec) 1015 + { 1016 + const char *tosec; 1017 + 1018 + tosec = sec_name(elf, sym->st_shndx); 1019 + if (section_mismatch(fromsec, tosec)) { 1020 + const char *fromsym; 1021 + const char *tosym; 1022 + 1023 + fromsym = sym_name(elf, 1024 + find_elf_symbol2(elf, r->r_offset, fromsec)); 1025 + tosym = sym_name(elf, 1026 + find_elf_symbol(elf, r->r_addend, sym)); 1027 + 1028 + /* check whitelist - we may ignore it */ 1029 + if (secref_whitelist(fromsec, fromsym, tosec, tosym)) { 1030 + report_sec_mismatch(modname, fromsec, r->r_offset, 1031 + fromsym, tosec, tosym); 1032 + } 1026 1033 } 1027 1034 } 1028 1035 ··· 1116 1107 Elf_Rela r; 1117 1108 unsigned int r_sym; 1118 1109 const char *fromsec; 1119 - const char * tosec; 1120 1110 1121 1111 Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset; 1122 1112 Elf_Rela *stop = (void *)start + sechdr->sh_size; ··· 1125 1117 /* if from section (name) is know good then skip it */ 1126 1118 if (match(fromsec, section_white_list)) 1127 1119 return; 1128 - 1129 1120 for (rela = start; rela < stop; rela++) { 1130 1121 r.r_offset = TO_NATIVE(rela->r_offset); 1131 1122 #if KERNEL_ELFCLASS == ELFCLASS64 ··· 1147 1140 /* Skip special sections */ 1148 1141 if (sym->st_shndx >= SHN_LORESERVE) 1149 1142 continue; 1150 - 1151 - tosec = sec_name(elf, sym->st_shndx); 1152 - if (section_mismatch(fromsec, tosec)) 1153 - warn_sec_mismatch(modname, fromsec, elf, sym, r); 1143 + check_section_mismatch(modname, elf, &r, sym, fromsec); 1154 1144 } 1155 1145 } 1156 1146 ··· 1159 1155 Elf_Rela r; 1160 1156 unsigned int r_sym; 1161 1157 const char *fromsec; 1162 - const char * tosec; 1163 1158 1164 1159 Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset; 1165 1160 Elf_Rel *stop = (void *)start + sechdr->sh_size; ··· 1205 1202 /* Skip special sections */ 1206 1203 if (sym->st_shndx >= SHN_LORESERVE) 1207 1204 continue; 1208 - 1209 - tosec = sec_name(elf, sym->st_shndx); 1210 - if (section_mismatch(fromsec, tosec)) 1211 - warn_sec_mismatch(modname, fromsec, elf, sym, r); 1205 + check_section_mismatch(modname, elf, &r, sym, fromsec); 1212 1206 } 1213 1207 } 1214 1208