Commit af92a82d0fec4dfd344b2ffd7a63e30f05c53938
1 parent
fc2f7efadb
Exists in
master
and in
4 other branches
modpost: make symbol white list a per mismatch type variable
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Showing 1 changed file with 31 additions and 18 deletions Side-by-side Diff
scripts/mod/modpost.c
... | ... | @@ -817,18 +817,15 @@ |
817 | 817 | |
818 | 818 | |
819 | 819 | /* symbols in .data that may refer to init/exit sections */ |
820 | -static const char *symbol_white_list[] = | |
821 | -{ | |
822 | - "*driver", | |
823 | - "*_template", /* scsi uses *_template a lot */ | |
824 | - "*_timer", /* arm uses ops structures named _timer a lot */ | |
825 | - "*_sht", /* scsi also used *_sht to some extent */ | |
826 | - "*_ops", | |
827 | - "*_probe", | |
828 | - "*_probe_one", | |
829 | - "*_console", | |
830 | - NULL | |
831 | -}; | |
820 | +#define DEFAULT_SYMBOL_WHITE_LIST \ | |
821 | + "*driver", \ | |
822 | + "*_template", /* scsi uses *_template a lot */ \ | |
823 | + "*_timer", /* arm uses ops structures named _timer a lot */ \ | |
824 | + "*_sht", /* scsi also used *_sht to some extent */ \ | |
825 | + "*_ops", \ | |
826 | + "*_probe", \ | |
827 | + "*_probe_one", \ | |
828 | + "*_console" | |
832 | 829 | |
833 | 830 | static const char *head_sections[] = { ".head.text*", NULL }; |
834 | 831 | static const char *linker_symbols[] = |
... | ... | @@ -850,6 +847,7 @@ |
850 | 847 | const char *fromsec[20]; |
851 | 848 | const char *tosec[20]; |
852 | 849 | enum mismatch mismatch; |
850 | + const char *symbol_white_list[20]; | |
853 | 851 | }; |
854 | 852 | |
855 | 853 | const struct sectioncheck sectioncheck[] = { |
856 | 854 | |
857 | 855 | |
858 | 856 | |
859 | 857 | |
860 | 858 | |
861 | 859 | |
862 | 860 | |
863 | 861 | |
864 | 862 | |
865 | 863 | |
866 | 864 | |
867 | 865 | |
... | ... | @@ -860,75 +858,88 @@ |
860 | 858 | .fromsec = { TEXT_SECTIONS, NULL }, |
861 | 859 | .tosec = { ALL_INIT_SECTIONS, NULL }, |
862 | 860 | .mismatch = TEXT_TO_ANY_INIT, |
861 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
863 | 862 | }, |
864 | 863 | { |
865 | 864 | .fromsec = { DATA_SECTIONS, NULL }, |
866 | 865 | .tosec = { ALL_INIT_SECTIONS, NULL }, |
867 | 866 | .mismatch = DATA_TO_ANY_INIT, |
867 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
868 | 868 | }, |
869 | 869 | { |
870 | 870 | .fromsec = { TEXT_SECTIONS, NULL }, |
871 | 871 | .tosec = { ALL_EXIT_SECTIONS, NULL }, |
872 | 872 | .mismatch = TEXT_TO_ANY_EXIT, |
873 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
873 | 874 | }, |
874 | 875 | { |
875 | 876 | .fromsec = { DATA_SECTIONS, NULL }, |
876 | 877 | .tosec = { ALL_EXIT_SECTIONS, NULL }, |
877 | 878 | .mismatch = DATA_TO_ANY_EXIT, |
879 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
878 | 880 | }, |
879 | 881 | /* Do not reference init code/data from devinit/cpuinit/meminit code/data */ |
880 | 882 | { |
881 | 883 | .fromsec = { ALL_XXXINIT_SECTIONS, NULL }, |
882 | 884 | .tosec = { INIT_SECTIONS, NULL }, |
883 | 885 | .mismatch = XXXINIT_TO_SOME_INIT, |
886 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
884 | 887 | }, |
885 | 888 | /* Do not reference cpuinit code/data from meminit code/data */ |
886 | 889 | { |
887 | 890 | .fromsec = { MEM_INIT_SECTIONS, NULL }, |
888 | 891 | .tosec = { CPU_INIT_SECTIONS, NULL }, |
889 | 892 | .mismatch = XXXINIT_TO_SOME_INIT, |
893 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
890 | 894 | }, |
891 | 895 | /* Do not reference meminit code/data from cpuinit code/data */ |
892 | 896 | { |
893 | 897 | .fromsec = { CPU_INIT_SECTIONS, NULL }, |
894 | 898 | .tosec = { MEM_INIT_SECTIONS, NULL }, |
895 | 899 | .mismatch = XXXINIT_TO_SOME_INIT, |
900 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
896 | 901 | }, |
897 | 902 | /* Do not reference exit code/data from devexit/cpuexit/memexit code/data */ |
898 | 903 | { |
899 | 904 | .fromsec = { ALL_XXXEXIT_SECTIONS, NULL }, |
900 | 905 | .tosec = { EXIT_SECTIONS, NULL }, |
901 | 906 | .mismatch = XXXEXIT_TO_SOME_EXIT, |
907 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
902 | 908 | }, |
903 | 909 | /* Do not reference cpuexit code/data from memexit code/data */ |
904 | 910 | { |
905 | 911 | .fromsec = { MEM_EXIT_SECTIONS, NULL }, |
906 | 912 | .tosec = { CPU_EXIT_SECTIONS, NULL }, |
907 | 913 | .mismatch = XXXEXIT_TO_SOME_EXIT, |
914 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
908 | 915 | }, |
909 | 916 | /* Do not reference memexit code/data from cpuexit code/data */ |
910 | 917 | { |
911 | 918 | .fromsec = { CPU_EXIT_SECTIONS, NULL }, |
912 | 919 | .tosec = { MEM_EXIT_SECTIONS, NULL }, |
913 | 920 | .mismatch = XXXEXIT_TO_SOME_EXIT, |
921 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
914 | 922 | }, |
915 | 923 | /* Do not use exit code/data from init code */ |
916 | 924 | { |
917 | 925 | .fromsec = { ALL_INIT_SECTIONS, NULL }, |
918 | 926 | .tosec = { ALL_EXIT_SECTIONS, NULL }, |
919 | 927 | .mismatch = ANY_INIT_TO_ANY_EXIT, |
928 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
920 | 929 | }, |
921 | 930 | /* Do not use init code/data from exit code */ |
922 | 931 | { |
923 | 932 | .fromsec = { ALL_EXIT_SECTIONS, NULL }, |
924 | 933 | .tosec = { ALL_INIT_SECTIONS, NULL }, |
925 | 934 | .mismatch = ANY_EXIT_TO_ANY_INIT, |
935 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
926 | 936 | }, |
927 | 937 | /* Do not export init/exit functions or data */ |
928 | 938 | { |
929 | 939 | .fromsec = { "__ksymtab*", NULL }, |
930 | 940 | .tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL }, |
931 | - .mismatch = EXPORT_TO_INIT_EXIT | |
941 | + .mismatch = EXPORT_TO_INIT_EXIT, | |
942 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
932 | 943 | } |
933 | 944 | }; |
934 | 945 | |
... | ... | @@ -985,7 +996,8 @@ |
985 | 996 | * refsymname = __init_begin, _sinittext, _einittext |
986 | 997 | * |
987 | 998 | **/ |
988 | -static int secref_whitelist(const char *fromsec, const char *fromsym, | |
999 | +static int secref_whitelist(const struct sectioncheck *mismatch, | |
1000 | + const char *fromsec, const char *fromsym, | |
989 | 1001 | const char *tosec, const char *tosym) |
990 | 1002 | { |
991 | 1003 | /* Check for pattern 1 */ |
... | ... | @@ -997,7 +1009,7 @@ |
997 | 1009 | /* Check for pattern 2 */ |
998 | 1010 | if (match(tosec, init_exit_sections) && |
999 | 1011 | match(fromsec, data_sections) && |
1000 | - match(fromsym, symbol_white_list)) | |
1012 | + match(fromsym, mismatch->symbol_white_list)) | |
1001 | 1013 | return 0; |
1002 | 1014 | |
1003 | 1015 | /* Check for pattern 3 */ |
... | ... | @@ -1202,7 +1214,7 @@ |
1202 | 1214 | fromsym, sec2annotation(tosec), tosym); |
1203 | 1215 | break; |
1204 | 1216 | case DATA_TO_ANY_INIT: { |
1205 | - const char **s = symbol_white_list; | |
1217 | + const char *const *s = mismatch->symbol_white_list; | |
1206 | 1218 | fprintf(stderr, |
1207 | 1219 | "The variable %s references\n" |
1208 | 1220 | "the %s %s%s%s\n" |
... | ... | @@ -1223,7 +1235,7 @@ |
1223 | 1235 | fromsym, to, to, tosym, to_p, sec2annotation(tosec), tosym); |
1224 | 1236 | break; |
1225 | 1237 | case DATA_TO_ANY_EXIT: { |
1226 | - const char **s = symbol_white_list; | |
1238 | + const char *const *s = mismatch->symbol_white_list; | |
1227 | 1239 | fprintf(stderr, |
1228 | 1240 | "The variable %s references\n" |
1229 | 1241 | "the %s %s%s%s\n" |
... | ... | @@ -1304,7 +1316,8 @@ |
1304 | 1316 | tosym = sym_name(elf, to); |
1305 | 1317 | |
1306 | 1318 | /* check whitelist - we may ignore it */ |
1307 | - if (secref_whitelist(fromsec, fromsym, tosec, tosym)) { | |
1319 | + if (secref_whitelist(mismatch, | |
1320 | + fromsec, fromsym, tosec, tosym)) { | |
1308 | 1321 | report_sec_mismatch(modname, mismatch, |
1309 | 1322 | fromsec, r->r_offset, fromsym, |
1310 | 1323 | is_function(from), tosec, tosym, |