diff options
author | Sam Ravnborg <sam@mars.ravnborg.org> | 2006-01-28 22:22:33 +0100 |
---|---|---|
committer | Sam Ravnborg <sam@mars.ravnborg.org> | 2006-02-19 09:51:18 +0100 |
commit | 8e70c45887a6bbe40393342ea5b426b0dd836dff (patch) | |
tree | 4fb8c40ca679a4f02321497642a2cf303dd80c43 /scripts/mod | |
parent | kbuild: improved modversioning support for external modules (diff) | |
download | linux-8e70c45887a6bbe40393342ea5b426b0dd836dff.tar.xz linux-8e70c45887a6bbe40393342ea5b426b0dd836dff.zip |
kbuild: warn about duplicate exported symbols
In modpost introduce a check for symbols exported twice.
This check caught only one victim (inet_bind_bucket_create) for
which a patch is already sent to netdev.
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Diffstat (limited to 'scripts/mod')
-rw-r--r-- | scripts/mod/modpost.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 976adf152db3..d901095ea8b7 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -117,6 +117,7 @@ struct symbol { unsigned int vmlinux:1; /* 1 if symbol is defined in vmlinux */ unsigned int kernel:1; /* 1 if symbol is from kernel * (only for external modules) **/ + unsigned int preloaded:1; /* 1 if symbol from Module.symvers */ char name[0]; }; @@ -186,9 +187,17 @@ static struct symbol *sym_add_exported(const char *name, struct module *mod) { struct symbol *s = find_symbol(name); - if (!s) + if (!s) { s = new_symbol(name, mod); - + } else { + if (!s->preloaded) { + warn("%s: duplicate symbol '%s' previous definition " + "was in %s%s\n", mod->name, name, + s->module->name, + is_vmlinux(s->module->name) ?"":".ko"); + } + } + s->preloaded = 0; s->vmlinux = is_vmlinux(mod->name); s->kernel = 0; return s; @@ -706,7 +715,8 @@ static void read_dump(const char *fname, unsigned int kernel) mod->skip = 1; } s = sym_add_exported(symname, mod); - s->kernel = kernel; + s->kernel = kernel; + s->preloaded = 1; sym_update_crc(symname, mod, crc); } return; |