|
@@ -254,6 +254,28 @@ static enum export export_no(const char *s)
|
|
|
return export_unknown;
|
|
|
}
|
|
|
|
|
|
+static const char *sec_name(struct elf_info *elf, int secindex);
|
|
|
+
|
|
|
+#define strstarts(str, prefix) (strncmp(str, prefix, strlen(prefix)) == 0)
|
|
|
+
|
|
|
+static enum export export_from_secname(struct elf_info *elf, unsigned int sec)
|
|
|
+{
|
|
|
+ const char *secname = sec_name(elf, sec);
|
|
|
+
|
|
|
+ if (strstarts(secname, "___ksymtab+"))
|
|
|
+ return export_plain;
|
|
|
+ else if (strstarts(secname, "___ksymtab_unused+"))
|
|
|
+ return export_unused;
|
|
|
+ else if (strstarts(secname, "___ksymtab_gpl+"))
|
|
|
+ return export_gpl;
|
|
|
+ else if (strstarts(secname, "___ksymtab_unused_gpl+"))
|
|
|
+ return export_unused_gpl;
|
|
|
+ else if (strstarts(secname, "___ksymtab_gpl_future+"))
|
|
|
+ return export_gpl_future;
|
|
|
+ else
|
|
|
+ return export_unknown;
|
|
|
+}
|
|
|
+
|
|
|
static enum export export_from_sec(struct elf_info *elf, unsigned int sec)
|
|
|
{
|
|
|
if (sec == elf->export_sec)
|
|
@@ -563,7 +585,12 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
|
|
|
Elf_Sym *sym, const char *symname)
|
|
|
{
|
|
|
unsigned int crc;
|
|
|
- enum export export = export_from_sec(info, get_secindex(info, sym));
|
|
|
+ enum export export;
|
|
|
+
|
|
|
+ if (!is_vmlinux(mod->name) && strncmp(symname, "__ksymtab", 9) == 0)
|
|
|
+ export = export_from_secname(info, get_secindex(info, sym));
|
|
|
+ else
|
|
|
+ export = export_from_sec(info, get_secindex(info, sym));
|
|
|
|
|
|
switch (sym->st_shndx) {
|
|
|
case SHN_COMMON:
|