linux/export: fix reference to exported functions for parisc64
authorMasahiro Yamada <masahiroy@kernel.org>
Tue, 5 Sep 2023 18:46:57 +0000 (03:46 +0900)
committerHelge Deller <deller@gmx.de>
Tue, 12 Sep 2023 15:42:00 +0000 (17:42 +0200)
John David Anglin reported parisc has been broken since commit
ddb5cdbafaaa ("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: ddb5cdbafaaa ("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>
include/linux/export-internal.h
scripts/mod/modpost.c

index 1c849db953a51a71809c9b428f5b092507473149..45fca09b231943ea38f56f5079ba7e431074f8a9 100644 (file)
@@ -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
index b29b29707f10462475e1ad8b258be08bf12eefe1..ba981f22908adaf96be9a852a49ccb7accc5fdc2 100644 (file)
@@ -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);