History

modpost: make symbol white list a per mismatch type variable

Uwe Kleine-König committed 16 years ago

Commit af92a821 parent fc2f7ef1 file · +31 −18Browse files

Unified · Split

scripts/mod/modpost.c+31−18
@@ -817,18 +817,15 @@ static const char *data_sections[] = { DATA_SECTIONS, NULL }; · 816 unmodified lines
817817
818818
819819 /* 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"
832829
833830 static const char *head_sections[] = { ".head.text*", NULL };
834831 static const char *linker_symbols[] =
@@ -850,6 +847,7 @@ struct sectioncheck { · 15 unmodified lines
850847 const char *fromsec[20];
851848 const char *tosec[20];
852849 enum mismatch mismatch;
850+ const char *symbol_white_list[20];
853851 };
854852
855853 const struct sectioncheck sectioncheck[] = {
@@ -860,75 +858,88 @@ const struct sectioncheck sectioncheck[] = { · 4 unmodified lines
860858 .fromsec = { TEXT_SECTIONS, NULL },
861859 .tosec = { ALL_INIT_SECTIONS, NULL },
862860 .mismatch = TEXT_TO_ANY_INIT,
861+ .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
863862 },
864863 {
865864 .fromsec = { DATA_SECTIONS, NULL },
866865 .tosec = { ALL_INIT_SECTIONS, NULL },
867866 .mismatch = DATA_TO_ANY_INIT,
867+ .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
868868 },
869869 {
870870 .fromsec = { TEXT_SECTIONS, NULL },
871871 .tosec = { ALL_EXIT_SECTIONS, NULL },
872872 .mismatch = TEXT_TO_ANY_EXIT,
873+ .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
873874 },
874875 {
875876 .fromsec = { DATA_SECTIONS, NULL },
876877 .tosec = { ALL_EXIT_SECTIONS, NULL },
877878 .mismatch = DATA_TO_ANY_EXIT,
879+ .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
878880 },
879881 /* Do not reference init code/data from devinit/cpuinit/meminit code/data */
880882 {
881883 .fromsec = { ALL_XXXINIT_SECTIONS, NULL },
882884 .tosec = { INIT_SECTIONS, NULL },
883885 .mismatch = XXXINIT_TO_SOME_INIT,
886+ .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
884887 },
885888 /* Do not reference cpuinit code/data from meminit code/data */
886889 {
887890 .fromsec = { MEM_INIT_SECTIONS, NULL },
888891 .tosec = { CPU_INIT_SECTIONS, NULL },
889892 .mismatch = XXXINIT_TO_SOME_INIT,
893+ .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
890894 },
891895 /* Do not reference meminit code/data from cpuinit code/data */
892896 {
893897 .fromsec = { CPU_INIT_SECTIONS, NULL },
894898 .tosec = { MEM_INIT_SECTIONS, NULL },
895899 .mismatch = XXXINIT_TO_SOME_INIT,
900+ .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
896901 },
897902 /* Do not reference exit code/data from devexit/cpuexit/memexit code/data */
898903 {
899904 .fromsec = { ALL_XXXEXIT_SECTIONS, NULL },
900905 .tosec = { EXIT_SECTIONS, NULL },
901906 .mismatch = XXXEXIT_TO_SOME_EXIT,
907+ .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
902908 },
903909 /* Do not reference cpuexit code/data from memexit code/data */
904910 {
905911 .fromsec = { MEM_EXIT_SECTIONS, NULL },
906912 .tosec = { CPU_EXIT_SECTIONS, NULL },
907913 .mismatch = XXXEXIT_TO_SOME_EXIT,
914+ .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
908915 },
909916 /* Do not reference memexit code/data from cpuexit code/data */
910917 {
911918 .fromsec = { CPU_EXIT_SECTIONS, NULL },
912919 .tosec = { MEM_EXIT_SECTIONS, NULL },
913920 .mismatch = XXXEXIT_TO_SOME_EXIT,
921+ .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
914922 },
915923 /* Do not use exit code/data from init code */
916924 {
917925 .fromsec = { ALL_INIT_SECTIONS, NULL },
918926 .tosec = { ALL_EXIT_SECTIONS, NULL },
919927 .mismatch = ANY_INIT_TO_ANY_EXIT,
928+ .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
920929 },
921930 /* Do not use init code/data from exit code */
922931 {
923932 .fromsec = { ALL_EXIT_SECTIONS, NULL },
924933 .tosec = { ALL_INIT_SECTIONS, NULL },
925934 .mismatch = ANY_EXIT_TO_ANY_INIT,
935+ .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
926936 },
927937 /* Do not export init/exit functions or data */
928938 {
929939 .fromsec = { "__ksymtab*", NULL },
930940 .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 },
932943 }
933944 };
934945
@@ -985,7 +996,8 @@ static const struct sectioncheck *section_mismatch( · 50 unmodified lines
985996 * refsymname = __init_begin, _sinittext, _einittext
986997 *
987998 **/
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,
9891001 const char *tosec, const char *tosym)
9901002 {
9911003 /* Check for pattern 1 */
@@ -997,7 +1009,7 @@ static int secref_whitelist(const char *fromsec, const char *fromsym, · 5 unmodified lines
9971009 /* Check for pattern 2 */
9981010 if (match(tosec, init_exit_sections) &&
9991011 match(fromsec, data_sections) &&
1000− match(fromsym, symbol_white_list))
1012+ match(fromsym, mismatch->symbol_white_list))
10011013 return 0;
10021014
10031015 /* Check for pattern 3 */
@@ -1202,7 +1214,7 @@ static void report_sec_mismatch(const char *modname, · 198 unmodified lines
12021214 fromsym, sec2annotation(tosec), tosym);
12031215 break;
12041216 case DATA_TO_ANY_INIT: {
1205− const char **s = symbol_white_list;
1217+ const char *const *s = mismatch->symbol_white_list;
12061218 fprintf(stderr,
12071219 "The variable %s references\n"
12081220 "the %s %s%s%s\n"
@@ -1223,7 +1235,7 @@ static void report_sec_mismatch(const char *modname, · 14 unmodified lines
12231235 fromsym, to, to, tosym, to_p, sec2annotation(tosec), tosym);
12241236 break;
12251237 case DATA_TO_ANY_EXIT: {
1226− const char **s = symbol_white_list;
1238+ const char *const *s = mismatch->symbol_white_list;
12271239 fprintf(stderr,
12281240 "The variable %s references\n"
12291241 "the %s %s%s%s\n"
@@ -1304,7 +1316,8 @@ static void check_section_mismatch(const char *modname, struct elf_info *elf, · 74 unmodified lines
13041316 tosym = sym_name(elf, to);
13051317
13061318 /* check whitelist - we may ignore it */
1307− if (secref_whitelist(fromsec, fromsym, tosec, tosym)) {
1319+ if (secref_whitelist(mismatch,
1320+ fromsec, fromsym, tosec, tosym)) {
13081321 report_sec_mismatch(modname, mismatch,
13091322 fromsec, r->r_offset, fromsym,
13101323 is_function(from), tosec, tosym,