aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Hacker <lerichi@gmx.net>2008-02-28 03:40:52 -0500
committerSam Ravnborg <sam@uranus.ravnborg.org>2008-04-25 14:35:47 -0400
commit2d04b5ae1bf527201a7505c9be7526c43ebd2930 (patch)
tree10d94ee815e7c98f40bb8a1c24813c7fb6c3ae64
parent35bb5b1e0e84cfa1a8906f7e6a77f391ff315791 (diff)
kbuild: support loading extra symbols in modpost
This patch adds a new command line option -E to modpost, expecting a symbol file as an argument which is read prior to symbol processing. -E can be supplied multiple times for as many files as is needed. When building kernel modules that depend on other modules not in the main kernel tree, modpost complains about undefined symbols: # make -C /path/to/linux/kernel M=/path/to/my/module ... Building modules, stage 2. .... WARNING: "rt_copy_buf" [/home/rich/osc_etl_rtw/osc_kmod.ko] undefined! ...etc This situation occurs when modpost processes the new module's symbols. When it finds symbols not exported by the mainline kernel, it issues this warning. The patch adds a new command line option -e to modpost which expects a symbol file as an argument. The symbols listed in this file are added to modpost's symbol tables during startup. -e can be supplied as often as required. This patch works together with the second patch. It introduces a new make variable, KBUILD_EXTRA_SYMBOLS, which is used when calling modpost. Signed-off-by: Richard Hacker <lerichi@gmx.net> Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
-rw-r--r--scripts/mod/modpost.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 843f6fa517cc..f8b42ab0724b 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -2019,6 +2019,11 @@ static void write_markers(const char *fname)
2019 write_if_changed(&buf, fname); 2019 write_if_changed(&buf, fname);
2020} 2020}
2021 2021
2022struct ext_sym_list {
2023 struct ext_sym_list *next;
2024 const char *file;
2025};
2026
2022int main(int argc, char **argv) 2027int main(int argc, char **argv)
2023{ 2028{
2024 struct module *mod; 2029 struct module *mod;
@@ -2029,8 +2034,10 @@ int main(int argc, char **argv)
2029 char *markers_write = NULL; 2034 char *markers_write = NULL;
2030 int opt; 2035 int opt;
2031 int err; 2036 int err;
2037 struct ext_sym_list *extsym_iter;
2038 struct ext_sym_list *extsym_start = NULL;
2032 2039
2033 while ((opt = getopt(argc, argv, "i:I:cmsSo:awM:K:")) != -1) { 2040 while ((opt = getopt(argc, argv, "i:I:e:cmsSo:awM:K:")) != -1) {
2034 switch (opt) { 2041 switch (opt) {
2035 case 'i': 2042 case 'i':
2036 kernel_read = optarg; 2043 kernel_read = optarg;
@@ -2042,6 +2049,14 @@ int main(int argc, char **argv)
2042 case 'c': 2049 case 'c':
2043 cross_build = 1; 2050 cross_build = 1;
2044 break; 2051 break;
2052 case 'e':
2053 external_module = 1;
2054 extsym_iter =
2055 NOFAIL(malloc(sizeof(*extsym_iter)));
2056 extsym_iter->next = extsym_start;
2057 extsym_iter->file = optarg;
2058 extsym_start = extsym_iter;
2059 break;
2045 case 'm': 2060 case 'm':
2046 modversions = 1; 2061 modversions = 1;
2047 break; 2062 break;
@@ -2075,6 +2090,12 @@ int main(int argc, char **argv)
2075 read_dump(kernel_read, 1); 2090 read_dump(kernel_read, 1);
2076 if (module_read) 2091 if (module_read)
2077 read_dump(module_read, 0); 2092 read_dump(module_read, 0);
2093 while (extsym_start) {
2094 read_dump(extsym_start->file, 0);
2095 extsym_iter = extsym_start->next;
2096 free(extsym_start);
2097 extsym_start = extsym_iter;
2098 }
2078 2099
2079 while (optind < argc) 2100 while (optind < argc)
2080 read_symbols(argv[optind++]); 2101 read_symbols(argv[optind++]);