diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-06-01 11:55:52 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-06-01 11:55:52 -0400 |
| commit | 1f73897861b8ef0be64ff4b801f8d6f830f683b5 (patch) | |
| tree | b4bae8f12e1422113910d8cb00a19d010dc4a52f /scripts/mod | |
| parent | b904d7131d116900524bd36ec170dcd97846bfd3 (diff) | |
| parent | 64ffc9ff424c65adcffe7d590018cc75e2d5d42a (diff) | |
Merge branch 'for-35' of git://repo.or.cz/linux-kbuild
* 'for-35' of git://repo.or.cz/linux-kbuild: (81 commits)
kbuild: Revert part of e8d400a to resolve a conflict
kbuild: Fix checking of scm-identifier variable
gconfig: add support to show hidden options that have prompts
menuconfig: add support to show hidden options which have prompts
gconfig: remove show_debug option
gconfig: remove dbg_print_ptype() and dbg_print_stype()
kconfig: fix zconfdump()
kconfig: some small fixes
add random binaries to .gitignore
kbuild: Include gen_initramfs_list.sh and the file list in the .d file
kconfig: recalc symbol value before showing search results
.gitignore: ignore *.lzo files
headerdep: perlcritic warning
scripts/Makefile.lib: Align the output of LZO
kbuild: Generate modules.builtin in make modules_install
Revert "kbuild: specify absolute paths for cscope"
kbuild: Do not unnecessarily regenerate modules.builtin
headers_install: use local file handles
headers_check: fix perl warnings
export_report: fix perl warnings
...
Diffstat (limited to 'scripts/mod')
| -rw-r--r-- | scripts/mod/modpost.c | 152 |
1 files changed, 88 insertions, 64 deletions
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 20923613467c..3318692e4e76 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
| @@ -781,10 +781,13 @@ static void check_section(const char *modname, struct elf_info *elf, | |||
| 781 | #define ALL_EXIT_TEXT_SECTIONS \ | 781 | #define ALL_EXIT_TEXT_SECTIONS \ |
| 782 | ".exit.text$", ".devexit.text$", ".cpuexit.text$", ".memexit.text$" | 782 | ".exit.text$", ".devexit.text$", ".cpuexit.text$", ".memexit.text$" |
| 783 | 783 | ||
| 784 | #define ALL_INIT_SECTIONS INIT_SECTIONS, DEV_INIT_SECTIONS, \ | 784 | #define ALL_XXXINIT_SECTIONS DEV_INIT_SECTIONS, CPU_INIT_SECTIONS, \ |
| 785 | CPU_INIT_SECTIONS, MEM_INIT_SECTIONS | 785 | MEM_INIT_SECTIONS |
| 786 | #define ALL_EXIT_SECTIONS EXIT_SECTIONS, DEV_EXIT_SECTIONS, \ | 786 | #define ALL_XXXEXIT_SECTIONS DEV_EXIT_SECTIONS, CPU_EXIT_SECTIONS, \ |
| 787 | CPU_EXIT_SECTIONS, MEM_EXIT_SECTIONS | 787 | MEM_EXIT_SECTIONS |
| 788 | |||
| 789 | #define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS | ||
| 790 | #define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS | ||
| 788 | 791 | ||
| 789 | #define DATA_SECTIONS ".data$", ".data.rel$" | 792 | #define DATA_SECTIONS ".data$", ".data.rel$" |
| 790 | #define TEXT_SECTIONS ".text$" | 793 | #define TEXT_SECTIONS ".text$" |
| @@ -814,33 +817,29 @@ static const char *data_sections[] = { DATA_SECTIONS, NULL }; | |||
| 814 | 817 | ||
| 815 | 818 | ||
| 816 | /* symbols in .data that may refer to init/exit sections */ | 819 | /* symbols in .data that may refer to init/exit sections */ |
| 817 | static const char *symbol_white_list[] = | 820 | #define DEFAULT_SYMBOL_WHITE_LIST \ |
| 818 | { | 821 | "*driver", \ |
| 819 | "*driver", | 822 | "*_template", /* scsi uses *_template a lot */ \ |
| 820 | "*_template", /* scsi uses *_template a lot */ | 823 | "*_timer", /* arm uses ops structures named _timer a lot */ \ |
| 821 | "*_timer", /* arm uses ops structures named _timer a lot */ | 824 | "*_sht", /* scsi also used *_sht to some extent */ \ |
| 822 | "*_sht", /* scsi also used *_sht to some extent */ | 825 | "*_ops", \ |
| 823 | "*_ops", | 826 | "*_probe", \ |
| 824 | "*_probe", | 827 | "*_probe_one", \ |
| 825 | "*_probe_one", | 828 | "*_console" |
| 826 | "*_console", | ||
| 827 | NULL | ||
| 828 | }; | ||
| 829 | 829 | ||
| 830 | static const char *head_sections[] = { ".head.text*", NULL }; | 830 | static const char *head_sections[] = { ".head.text*", NULL }; |
| 831 | static const char *linker_symbols[] = | 831 | static const char *linker_symbols[] = |
| 832 | { "__init_begin", "_sinittext", "_einittext", NULL }; | 832 | { "__init_begin", "_sinittext", "_einittext", NULL }; |
| 833 | 833 | ||
| 834 | enum mismatch { | 834 | enum mismatch { |
| 835 | NO_MISMATCH, | 835 | TEXT_TO_ANY_INIT, |
| 836 | TEXT_TO_INIT, | 836 | DATA_TO_ANY_INIT, |
| 837 | DATA_TO_INIT, | 837 | TEXT_TO_ANY_EXIT, |
| 838 | TEXT_TO_EXIT, | 838 | DATA_TO_ANY_EXIT, |
| 839 | DATA_TO_EXIT, | 839 | XXXINIT_TO_SOME_INIT, |
| 840 | XXXINIT_TO_INIT, | 840 | XXXEXIT_TO_SOME_EXIT, |
| 841 | XXXEXIT_TO_EXIT, | 841 | ANY_INIT_TO_ANY_EXIT, |
| 842 | INIT_TO_EXIT, | 842 | ANY_EXIT_TO_ANY_INIT, |
| 843 | EXIT_TO_INIT, | ||
| 844 | EXPORT_TO_INIT_EXIT, | 843 | EXPORT_TO_INIT_EXIT, |
| 845 | }; | 844 | }; |
| 846 | 845 | ||
| @@ -848,6 +847,7 @@ struct sectioncheck { | |||
| 848 | const char *fromsec[20]; | 847 | const char *fromsec[20]; |
| 849 | const char *tosec[20]; | 848 | const char *tosec[20]; |
| 850 | enum mismatch mismatch; | 849 | enum mismatch mismatch; |
| 850 | const char *symbol_white_list[20]; | ||
| 851 | }; | 851 | }; |
| 852 | 852 | ||
| 853 | const struct sectioncheck sectioncheck[] = { | 853 | const struct sectioncheck sectioncheck[] = { |
| @@ -857,80 +857,103 @@ const struct sectioncheck sectioncheck[] = { | |||
| 857 | { | 857 | { |
| 858 | .fromsec = { TEXT_SECTIONS, NULL }, | 858 | .fromsec = { TEXT_SECTIONS, NULL }, |
| 859 | .tosec = { ALL_INIT_SECTIONS, NULL }, | 859 | .tosec = { ALL_INIT_SECTIONS, NULL }, |
| 860 | .mismatch = TEXT_TO_INIT, | 860 | .mismatch = TEXT_TO_ANY_INIT, |
| 861 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | ||
| 861 | }, | 862 | }, |
| 862 | { | 863 | { |
| 863 | .fromsec = { DATA_SECTIONS, NULL }, | 864 | .fromsec = { DATA_SECTIONS, NULL }, |
| 864 | .tosec = { ALL_INIT_SECTIONS, NULL }, | 865 | .tosec = { ALL_XXXINIT_SECTIONS, NULL }, |
| 865 | .mismatch = DATA_TO_INIT, | 866 | .mismatch = DATA_TO_ANY_INIT, |
| 867 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | ||
| 868 | }, | ||
| 869 | { | ||
| 870 | .fromsec = { DATA_SECTIONS, NULL }, | ||
| 871 | .tosec = { INIT_SECTIONS, NULL }, | ||
| 872 | .mismatch = DATA_TO_ANY_INIT, | ||
| 873 | .symbol_white_list = { | ||
| 874 | "*_template", "*_timer", "*_sht", "*_ops", | ||
| 875 | "*_probe", "*_probe_one", "*_console", NULL | ||
| 876 | }, | ||
| 866 | }, | 877 | }, |
| 867 | { | 878 | { |
| 868 | .fromsec = { TEXT_SECTIONS, NULL }, | 879 | .fromsec = { TEXT_SECTIONS, NULL }, |
| 869 | .tosec = { ALL_EXIT_SECTIONS, NULL }, | 880 | .tosec = { ALL_EXIT_SECTIONS, NULL }, |
| 870 | .mismatch = TEXT_TO_EXIT, | 881 | .mismatch = TEXT_TO_ANY_EXIT, |
| 882 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | ||
| 871 | }, | 883 | }, |
| 872 | { | 884 | { |
| 873 | .fromsec = { DATA_SECTIONS, NULL }, | 885 | .fromsec = { DATA_SECTIONS, NULL }, |
| 874 | .tosec = { ALL_EXIT_SECTIONS, NULL }, | 886 | .tosec = { ALL_EXIT_SECTIONS, NULL }, |
| 875 | .mismatch = DATA_TO_EXIT, | 887 | .mismatch = DATA_TO_ANY_EXIT, |
| 888 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | ||
| 876 | }, | 889 | }, |
| 877 | /* Do not reference init code/data from devinit/cpuinit/meminit code/data */ | 890 | /* Do not reference init code/data from devinit/cpuinit/meminit code/data */ |
| 878 | { | 891 | { |
| 879 | .fromsec = { DEV_INIT_SECTIONS, CPU_INIT_SECTIONS, MEM_INIT_SECTIONS, NULL }, | 892 | .fromsec = { ALL_XXXINIT_SECTIONS, NULL }, |
| 880 | .tosec = { INIT_SECTIONS, NULL }, | 893 | .tosec = { INIT_SECTIONS, NULL }, |
| 881 | .mismatch = XXXINIT_TO_INIT, | 894 | .mismatch = XXXINIT_TO_SOME_INIT, |
| 895 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | ||
| 882 | }, | 896 | }, |
| 883 | /* Do not reference cpuinit code/data from meminit code/data */ | 897 | /* Do not reference cpuinit code/data from meminit code/data */ |
| 884 | { | 898 | { |
| 885 | .fromsec = { MEM_INIT_SECTIONS, NULL }, | 899 | .fromsec = { MEM_INIT_SECTIONS, NULL }, |
| 886 | .tosec = { CPU_INIT_SECTIONS, NULL }, | 900 | .tosec = { CPU_INIT_SECTIONS, NULL }, |
| 887 | .mismatch = XXXINIT_TO_INIT, | 901 | .mismatch = XXXINIT_TO_SOME_INIT, |
| 902 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | ||
| 888 | }, | 903 | }, |
| 889 | /* Do not reference meminit code/data from cpuinit code/data */ | 904 | /* Do not reference meminit code/data from cpuinit code/data */ |
| 890 | { | 905 | { |
| 891 | .fromsec = { CPU_INIT_SECTIONS, NULL }, | 906 | .fromsec = { CPU_INIT_SECTIONS, NULL }, |
| 892 | .tosec = { MEM_INIT_SECTIONS, NULL }, | 907 | .tosec = { MEM_INIT_SECTIONS, NULL }, |
| 893 | .mismatch = XXXINIT_TO_INIT, | 908 | .mismatch = XXXINIT_TO_SOME_INIT, |
| 909 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | ||
| 894 | }, | 910 | }, |
| 895 | /* Do not reference exit code/data from devexit/cpuexit/memexit code/data */ | 911 | /* Do not reference exit code/data from devexit/cpuexit/memexit code/data */ |
| 896 | { | 912 | { |
| 897 | .fromsec = { DEV_EXIT_SECTIONS, CPU_EXIT_SECTIONS, MEM_EXIT_SECTIONS, NULL }, | 913 | .fromsec = { ALL_XXXEXIT_SECTIONS, NULL }, |
| 898 | .tosec = { EXIT_SECTIONS, NULL }, | 914 | .tosec = { EXIT_SECTIONS, NULL }, |
| 899 | .mismatch = XXXEXIT_TO_EXIT, | 915 | .mismatch = XXXEXIT_TO_SOME_EXIT, |
| 916 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | ||
| 900 | }, | 917 | }, |
| 901 | /* Do not reference cpuexit code/data from memexit code/data */ | 918 | /* Do not reference cpuexit code/data from memexit code/data */ |
| 902 | { | 919 | { |
| 903 | .fromsec = { MEM_EXIT_SECTIONS, NULL }, | 920 | .fromsec = { MEM_EXIT_SECTIONS, NULL }, |
| 904 | .tosec = { CPU_EXIT_SECTIONS, NULL }, | 921 | .tosec = { CPU_EXIT_SECTIONS, NULL }, |
| 905 | .mismatch = XXXEXIT_TO_EXIT, | 922 | .mismatch = XXXEXIT_TO_SOME_EXIT, |
| 923 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | ||
| 906 | }, | 924 | }, |
| 907 | /* Do not reference memexit code/data from cpuexit code/data */ | 925 | /* Do not reference memexit code/data from cpuexit code/data */ |
| 908 | { | 926 | { |
| 909 | .fromsec = { CPU_EXIT_SECTIONS, NULL }, | 927 | .fromsec = { CPU_EXIT_SECTIONS, NULL }, |
| 910 | .tosec = { MEM_EXIT_SECTIONS, NULL }, | 928 | .tosec = { MEM_EXIT_SECTIONS, NULL }, |
| 911 | .mismatch = XXXEXIT_TO_EXIT, | 929 | .mismatch = XXXEXIT_TO_SOME_EXIT, |
| 930 | .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | ||
| 912 | }, | 931 | }, |
| 913 | /* Do not use exit code/data from init code */ | 932 | /* Do not use exit code/data from init code */ |
| 914 | { | 933 | { |
| 915 | .fromsec = { ALL_INIT_SECTIONS, NULL }, | ||
