diff options
Diffstat (limited to 'scripts/mod/modpost.c')
| -rw-r--r-- | scripts/mod/modpost.c | 29 | 
1 files changed, 28 insertions, 1 deletions
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 413c53693e62..a509ff8f32fa 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -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:  |