diff options
| author | Quentin Casasnovas <quentin.casasnovas@oracle.com> | 2015-04-13 07:11:04 -0400 |
|---|---|---|
| committer | Rusty Russell <rusty@rustcorp.com.au> | 2015-04-13 07:32:57 -0400 |
| commit | 050e57fd5936eb175cbb7a788252aa6867201120 (patch) | |
| tree | 76b3e48f4da1b18a36a0ec947d363ddae785599b /scripts/mod | |
| parent | cc9e605dc6cb2e32fedae4ac2f61ad3b5f8d623d (diff) | |
modpost: add strict white-listing when referencing sections.
Prints a warning when a section references a section outside a strict
white-list. This will be useful to print a warning if __ex_table
references a non-executable section.
Signed-off-by: Quentin Casasnovas <quentin.casasnovas@oracle.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'scripts/mod')
| -rw-r--r-- | scripts/mod/modpost.c | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index d439856f8176..7094a57273b9 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
| @@ -925,7 +925,8 @@ enum mismatch { | |||
| 925 | 925 | ||
| 926 | struct sectioncheck { | 926 | struct sectioncheck { |
| 927 | const char *fromsec[20]; | 927 | const char *fromsec[20]; |
| 928 | const char *tosec[20]; | 928 | const char *bad_tosec[20]; |
| 929 | const char *good_tosec[20]; | ||
| 929 | enum mismatch mismatch; | 930 | enum mismatch mismatch; |
| 930 | const char *symbol_white_list[20]; | 931 | const char *symbol_white_list[20]; |
| 931 | }; | 932 | }; |
| @@ -936,19 +937,19 @@ static const struct sectioncheck sectioncheck[] = { | |||
| 936 | */ | 937 | */ |
| 937 | { | 938 | { |
| 938 | .fromsec = { TEXT_SECTIONS, NULL }, | 939 | .fromsec = { TEXT_SECTIONS, NULL }, |
| 939 | .tosec = { ALL_INIT_SECTIONS, NULL }, | 940 | .bad_tosec = { ALL_INIT_SECTIONS, NULL }, |
| 940 | .mismatch = TEXT_TO_ANY_INIT, | 941 | .mismatch = TEXT_TO_ANY_INIT, |
| 941 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | 942 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, |
| 942 | }, | 943 | }, |
| 943 | { | 944 | { |
| 944 | .fromsec = { DATA_SECTIONS, NULL }, | 945 | .fromsec = { DATA_SECTIONS, NULL }, |
| 945 | .tosec = { ALL_XXXINIT_SECTIONS, NULL }, | 946 | .bad_tosec = { ALL_XXXINIT_SECTIONS, NULL }, |
| 946 | .mismatch = DATA_TO_ANY_INIT, | 947 | .mismatch = DATA_TO_ANY_INIT, |
| 947 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | 948 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, |
| 948 | }, | 949 | }, |
| 949 | { | 950 | { |
| 950 | .fromsec = { DATA_SECTIONS, NULL }, | 951 | .fromsec = { DATA_SECTIONS, NULL }, |
| 951 | .tosec = { INIT_SECTIONS, NULL }, | 952 | .bad_tosec = { INIT_SECTIONS, NULL }, |
| 952 | .mismatch = DATA_TO_ANY_INIT, | 953 | .mismatch = DATA_TO_ANY_INIT, |
| 953 | .symbol_white_list = { | 954 | .symbol_white_list = { |
| 954 | "*_template", "*_timer", "*_sht", "*_ops", | 955 | "*_template", "*_timer", "*_sht", "*_ops", |
| @@ -957,54 +958,54 @@ static const struct sectioncheck sectioncheck[] = { | |||
| 957 | }, | 958 | }, |
| 958 | { | 959 | { |
| 959 | .fromsec = { TEXT_SECTIONS, NULL }, | 960 | .fromsec = { TEXT_SECTIONS, NULL }, |
| 960 | .tosec = { ALL_EXIT_SECTIONS, NULL }, | 961 | .bad_tosec = { ALL_EXIT_SECTIONS, NULL }, |
| 961 | .mismatch = TEXT_TO_ANY_EXIT, | 962 | .mismatch = TEXT_TO_ANY_EXIT, |
| 962 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | 963 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, |
| 963 | }, | 964 | }, |
| 964 | { | 965 | { |
| 965 | .fromsec = { DATA_SECTIONS, NULL }, | 966 | .fromsec = { DATA_SECTIONS, NULL }, |
| 966 | .tosec = { ALL_EXIT_SECTIONS, NULL }, | 967 | .bad_tosec = { ALL_EXIT_SECTIONS, NULL }, |
| 967 | .mismatch = DATA_TO_ANY_EXIT, | 968 | .mismatch = DATA_TO_ANY_EXIT, |
| 968 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | 969 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, |
| 969 | }, | 970 | }, |
| 970 | /* Do not reference init code/data from meminit code/data */ | 971 | /* Do not reference init code/data from meminit code/data */ |
| 971 | { | 972 | { |
| 972 | .fromsec = { ALL_XXXINIT_SECTIONS, NULL }, | 973 | .fromsec = { ALL_XXXINIT_SECTIONS, NULL }, |
| 973 | .tosec = { INIT_SECTIONS, NULL }, | 974 | .bad_tosec = { INIT_SECTIONS, NULL }, |
| 974 | .mismatch = XXXINIT_TO_SOME_INIT, | 975 | .mismatch = XXXINIT_TO_SOME_INIT, |
| 975 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | 976 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, |
| 976 | }, | 977 | }, |
| 977 | /* Do not reference exit code/data from memexit code/data */ | 978 | /* Do not reference exit code/data from memexit code/data */ |
| 978 | { | 979 | { |
| 979 | .fromsec = { ALL_XXXEXIT_SECTIONS, NULL }, | 980 | .fromsec = { ALL_XXXEXIT_SECTIONS, NULL }, |
| 980 | .tosec = { EXIT_SECTIONS, NULL }, | 981 | .bad_tosec = { EXIT_SECTIONS, NULL }, |
| 981 | .mismatch = XXXEXIT_TO_SOME_EXIT, | 982 | .mismatch = XXXEXIT_TO_SOME_EXIT, |
| 982 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | 983 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, |
| 983 | }, | 984 | }, |
| 984 | /* Do not use exit code/data from init code */ | 985 | /* Do not use exit code/data from init code */ |
| 985 | { | 986 | { |
| 986 | .fromsec = { ALL_INIT_SECTIONS, NULL }, | 987 | .fromsec = { ALL_INIT_SECTIONS, NULL }, |
| 987 | .tosec = { ALL_EXIT_SECTIONS, NULL }, | 988 | .bad_tosec = { ALL_EXIT_SECTIONS, NULL }, |
| 988 | .mismatch = ANY_INIT_TO_ANY_EXIT, | 989 | .mismatch = ANY_INIT_TO_ANY_EXIT, |
| 989 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | 990 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, |
| 990 | }, | 991 | }, |
| 991 | /* Do not use init code/data from exit code */ | 992 | /* Do not use init code/data from exit code */ |
| 992 | { | 993 | { |
| 993 | .fromsec = { ALL_EXIT_SECTIONS, NULL }, | 994 | .fromsec = { ALL_EXIT_SECTIONS, NULL }, |
| 994 | .tosec = { ALL_INIT_SECTIONS, NULL }, | 995 | .bad_tosec = { ALL_INIT_SECTIONS, NULL }, |
| 995 | .mismatch = ANY_EXIT_TO_ANY_INIT, | 996 | .mismatch = ANY_EXIT_TO_ANY_INIT, |
| 996 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | 997 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, |
| 997 | }, | 998 | }, |
| 998 | { | 999 | { |
| 999 | .fromsec = { ALL_PCI_INIT_SECTIONS, NULL }, | 1000 | .fromsec = { ALL_PCI_INIT_SECTIONS, NULL }, |
| 1000 | .tosec = { INIT_SECTIONS, NULL }, | 1001 | .bad_tosec = { INIT_SECTIONS, NULL }, |
| 1001 | .mismatch = ANY_INIT_TO_ANY_EXIT, | 1002 | .mismatch = ANY_INIT_TO_ANY_EXIT, |
| 1002 | .symbol_white_list = { NULL }, | 1003 | .symbol_white_list = { NULL }, |
| 1003 | }, | 1004 | }, |
| 1004 | /* Do not export init/exit functions or data */ | 1005 | /* Do not export init/exit functions or data */ |
| 1005 | { | 1006 | { |
| 1006 | .fromsec = { "__ksymtab*", NULL }, | 1007 | .fromsec = { "__ksymtab*", NULL }, |
| 1007 | .tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL }, | 1008 | .bad_tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL }, |
| 1008 | .mismatch = EXPORT_TO_INIT_EXIT, | 1009 | .mismatch = EXPORT_TO_INIT_EXIT, |
| 1009 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | 1010 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, |
| 1010 | } | 1011 | } |
| @@ -1018,9 +1019,12 @@ static const struct sectioncheck *section_mismatch( | |||
| 1018 | const struct sectioncheck *check = §ioncheck[0]; | 1019 | const struct sectioncheck *check = §ioncheck[0]; |
| 1019 | 1020 | ||
| 1020 | for (i = 0; i < elems; i++) { | 1021 | for (i = 0; i < elems; i++) { |
| 1021 | if (match(fromsec, check->fromsec) && | 1022 | if (match(fromsec, check->fromsec)) { |
| 1022 | match(tosec, check->tosec)) | 1023 | if (check->bad_tosec[0] && match(tosec, check->bad_tosec)) |
| 1023 | return check; | 1024 | return check; |
| 1025 | if (check->good_tosec[0] && !match(tosec, check->good_tosec)) | ||
| 1026 | return check; | ||
| 1027 | } | ||
| 1024 | check++; | 1028 | check++; |
| 1025 | } | 1029 | } |
| 1026 | return NULL; | 1030 | return NULL; |
