Commit af92a82d0fec4dfd344b2ffd7a63e30f05c53938

Authored by Uwe Kleine-König
1 parent fc2f7efadb

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,