mirror of
https://github.com/lkl/linux.git
synced 2025-12-19 16:13:19 +09:00
linux/export: fix reference to exported functions for parisc64
John David Anglin reported parisc has been broken since commitddb5cdbafa("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:ddb5cdbafa("kbuild: generate KSYMTAB entries by modpost") Reported-by: John David Anglin <dave.anglin@bell.net> Tested-by: John David Anglin <dave.anglin@bell.net> Tested-by: Helge Deller <deller@gmx.de> Closes: https://lore.kernel.org/linux-parisc/1901598a-e11d-f7dd-a5d9-9a69d06e6b6e@bell.net/T/#u Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Signed-off-by: Helge Deller <deller@gmx.de>
This commit is contained in:
committed by
Helge Deller
parent
e5ef93d02d
commit
08700ec705
@@ -52,6 +52,8 @@
|
|||||||
|
|
||||||
#ifdef CONFIG_IA64
|
#ifdef CONFIG_IA64
|
||||||
#define KSYM_FUNC(name) @fptr(name)
|
#define KSYM_FUNC(name) @fptr(name)
|
||||||
|
#elif defined(CONFIG_PARISC) && defined(CONFIG_64BIT)
|
||||||
|
#define KSYM_FUNC(name) P%name
|
||||||
#else
|
#else
|
||||||
#define KSYM_FUNC(name) name
|
#define KSYM_FUNC(name) name
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -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);
|
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)))
|
if (match(secname, PATTERNS(INIT_SECTIONS)))
|
||||||
warn("%s: %s: EXPORT_SYMBOL used for init symbol. Remove __init or EXPORT_SYMBOL.\n",
|
warn("%s: %s: EXPORT_SYMBOL used for init symbol. Remove __init or EXPORT_SYMBOL.\n",
|
||||||
mod->name, name);
|
mod->name, name);
|
||||||
|
|||||||
Reference in New Issue
Block a user