Skip to content

Commit af92a82

Browse files
author
Uwe Kleine-König
committed
modpost: make symbol white list a per mismatch type variable
Signed-off-by: Uwe Kleine-König <[email protected]>
1 parent fc2f7ef commit af92a82

File tree

1 file changed

+31
-18
lines changed

1 file changed

+31
-18
lines changed

scripts/mod/modpost.c

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -817,18 +817,15 @@ static const char *data_sections[] = { DATA_SECTIONS, NULL };
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 {
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[] = {
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(
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,
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,
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,
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,
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,

0 commit comments

Comments
 (0)