Commit 08700ec7 authored by Masahiro Yamada's avatar Masahiro Yamada Committed by Helge Deller
Browse files

linux/export: fix reference to exported functions for parisc64



John David Anglin reported parisc has been broken since commit
ddb5cdba ("kbuild: generate KSYMTAB entries by modpost").

Like ia64, parisc64 uses a function descriptor. The function
references must be prefixed with P%.

Also, symbols prefixed $$ from the library have the symbol type
STT_LOPROC instead of STT_FUNC. They should be handled as functions
too.

Fixes: ddb5cdba ("kbuild: generate KSYMTAB entries by modpost")
Reported-by: default avatarJohn David Anglin <dave.anglin@bell.net>
Tested-by: default avatarJohn David Anglin <dave.anglin@bell.net>
Tested-by: default avatarHelge Deller <deller@gmx.de>
Closes: https://lore.kernel.org/linux-parisc/1901598a-e11d-f7dd-a5d9-9a69d06e6b6e@bell.net/T/#u


Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
Signed-off-by: default avatarHelge Deller <deller@gmx.de>
parent e5ef93d0
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -52,6 +52,8 @@

#ifdef CONFIG_IA64
#define KSYM_FUNC(name)		@fptr(name)
#elif defined(CONFIG_PARISC) && defined(CONFIG_64BIT)
#define KSYM_FUNC(name)		P%name
#else
#define KSYM_FUNC(name)		name
#endif
+9 −0
Original line number Diff line number Diff line
@@ -1226,6 +1226,15 @@ static void check_export_symbol(struct module *mod, struct elf_info *elf,
	 */
	s->is_func = (ELF_ST_TYPE(sym->st_info) == STT_FUNC);

	/*
	 * For parisc64, symbols prefixed $$ from the library have the symbol type
	 * STT_LOPROC. They should be handled as functions too.
	 */
	if (elf->hdr->e_ident[EI_CLASS] == ELFCLASS64 &&
	    elf->hdr->e_machine == EM_PARISC &&
	    ELF_ST_TYPE(sym->st_info) == STT_LOPROC)
		s->is_func = true;

	if (match(secname, PATTERNS(INIT_SECTIONS)))
		warn("%s: %s: EXPORT_SYMBOL used for init symbol. Remove __init or EXPORT_SYMBOL.\n",
		     mod->name, name);