Commit b92021b0 authored by Rusty Russell's avatar Rusty Russell

CONFIG_SYMBOL_PREFIX: cleanup.

We have CONFIG_SYMBOL_PREFIX, which three archs define to the string
"_".  But Al Viro broke this in "consolidate cond_syscall and
SYSCALL_ALIAS declarations" (in linux-next), and he's not the first to
do so.

Using CONFIG_SYMBOL_PREFIX is awkward, since we usually just want to
prefix it so something.  So various places define helpers which are
defined to nothing if CONFIG_SYMBOL_PREFIX isn't set:

1) include/asm-generic/unistd.h defines __SYMBOL_PREFIX.
2) include/asm-generic/vmlinux.lds.h defines VMLINUX_SYMBOL(sym)
3) include/linux/export.h defines MODULE_SYMBOL_PREFIX.
4) include/linux/kernel.h defines SYMBOL_PREFIX (which differs from #7)
5) kernel/modsign_certificate.S defines ASM_SYMBOL(sym)
6) scripts/modpost.c defines MODULE_SYMBOL_PREFIX
7) scripts/Makefile.lib defines SYMBOL_PREFIX on the commandline if
   CONFIG_SYMBOL_PREFIX is set, so that we have a non-string version
   for pasting.

(arch/h8300/include/asm/linkage.h defines SYMBOL_NAME(), too).

Let's solve this properly:
1) No more generic prefix, just CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX.
2) Make linux/export.h usable from asm.
3) Define VMLINUX_SYMBOL() and VMLINUX_SYMBOL_STR().
4) Make everyone use them.
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
Reviewed-by: default avatarJames Hogan <james.hogan@imgtec.com>
Tested-by: James Hogan <james.hogan@imgtec.com> (metag)
parent 4febd95a
...@@ -1398,7 +1398,7 @@ quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files)) ...@@ -1398,7 +1398,7 @@ quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files))
# Run depmod only if we have System.map and depmod is executable # Run depmod only if we have System.map and depmod is executable
quiet_cmd_depmod = DEPMOD $(KERNELRELEASE) quiet_cmd_depmod = DEPMOD $(KERNELRELEASE)
cmd_depmod = $(CONFIG_SHELL) $(srctree)/scripts/depmod.sh $(DEPMOD) \ cmd_depmod = $(CONFIG_SHELL) $(srctree)/scripts/depmod.sh $(DEPMOD) \
$(KERNELRELEASE) "$(patsubst "%",%,$(CONFIG_SYMBOL_PREFIX))" $(KERNELRELEASE) "$(patsubst y,_,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX))"
# Create temporary dir for module support files # Create temporary dir for module support files
# clean it up only when building all modules # clean it up only when building all modules
......
...@@ -384,6 +384,12 @@ config MODULES_USE_ELF_REL ...@@ -384,6 +384,12 @@ config MODULES_USE_ELF_REL
Modules only use ELF REL relocations. Modules with ELF RELA Modules only use ELF REL relocations. Modules with ELF RELA
relocations will give an error. relocations will give an error.
config HAVE_UNDERSCORE_SYMBOL_PREFIX
bool
help
Some architectures generate an _ in front of C symbols; things like
module loading and assembly files need to know about this.
# #
# ABI hall of shame # ABI hall of shame
# #
......
config SYMBOL_PREFIX
string
default "_"
config MMU config MMU
def_bool n def_bool n
...@@ -33,6 +29,7 @@ config BLACKFIN ...@@ -33,6 +29,7 @@ config BLACKFIN
select ARCH_HAVE_CUSTOM_GPIO_H select ARCH_HAVE_CUSTOM_GPIO_H
select ARCH_WANT_OPTIONAL_GPIOLIB select ARCH_WANT_OPTIONAL_GPIOLIB
select HAVE_UID16 select HAVE_UID16
select HAVE_UNDERSCORE_SYMBOL_PREFIX
select VIRT_TO_BUS select VIRT_TO_BUS
select ARCH_WANT_IPC_PARSE_VERSION select ARCH_WANT_IPC_PARSE_VERSION
select HAVE_GENERIC_HARDIRQS select HAVE_GENERIC_HARDIRQS
......
...@@ -12,10 +12,7 @@ config H8300 ...@@ -12,10 +12,7 @@ config H8300
select MODULES_USE_ELF_RELA select MODULES_USE_ELF_RELA
select OLD_SIGSUSPEND3 select OLD_SIGSUSPEND3
select OLD_SIGACTION select OLD_SIGACTION
select HAVE_UNDERSCORE_SYMBOL_PREFIX
config SYMBOL_PREFIX
string
default "_"
config MMU config MMU
bool bool
......
config SYMBOL_PREFIX
string
default "_"
config METAG config METAG
def_bool y def_bool y
select EMBEDDED select EMBEDDED
...@@ -27,6 +23,7 @@ config METAG ...@@ -27,6 +23,7 @@ config METAG
select HAVE_MOD_ARCH_SPECIFIC select HAVE_MOD_ARCH_SPECIFIC
select HAVE_PERF_EVENTS select HAVE_PERF_EVENTS
select HAVE_SYSCALL_TRACEPOINTS select HAVE_SYSCALL_TRACEPOINTS
select HAVE_UNDERSCORE_SYMBOL_PREFIX
select IRQ_DOMAIN select IRQ_DOMAIN
select MODULES_USE_ELF_RELA select MODULES_USE_ELF_RELA
select OF select OF
......
...@@ -204,14 +204,16 @@ static inline struct mtd_info *cfi_cmdset_unknown(struct map_info *map, ...@@ -204,14 +204,16 @@ static inline struct mtd_info *cfi_cmdset_unknown(struct map_info *map,
struct cfi_private *cfi = map->fldrv_priv; struct cfi_private *cfi = map->fldrv_priv;
__u16 type = primary?cfi->cfiq->P_ID:cfi->cfiq->A_ID; __u16 type = primary?cfi->cfiq->P_ID:cfi->cfiq->A_ID;
#ifdef CONFIG_MODULES #ifdef CONFIG_MODULES
char probename[16+sizeof(MODULE_SYMBOL_PREFIX)]; char probename[sizeof(VMLINUX_SYMBOL_STR(cfi_cmdset_%4.4X))];
cfi_cmdset_fn_t *probe_function; cfi_cmdset_fn_t *probe_function;
sprintf(probename, MODULE_SYMBOL_PREFIX "cfi_cmdset_%4.4X", type); sprintf(probename, VMLINUX_SYMBOL_STR(cfi_cmdset_%4.4X), type);
probe_function = __symbol_get(probename); probe_function = __symbol_get(probename);
if (!probe_function) { if (!probe_function) {
request_module(probename + sizeof(MODULE_SYMBOL_PREFIX) - 1); char modname[sizeof("cfi_cmdset_%4.4X")];
sprintf(modname, "cfi_cmdset_%4.4X", type);
request_module(modname);
probe_function = __symbol_get(probename); probe_function = __symbol_get(probename);
} }
......
#include <uapi/asm-generic/unistd.h> #include <uapi/asm-generic/unistd.h>
#include <linux/export.h>
/* /*
* These are required system calls, we should * These are required system calls, we should
...@@ -17,12 +18,7 @@ ...@@ -17,12 +18,7 @@
* but it doesn't work on all toolchains, so we just do it by hand * but it doesn't work on all toolchains, so we just do it by hand
*/ */
#ifndef cond_syscall #ifndef cond_syscall
#ifdef CONFIG_SYMBOL_PREFIX #define cond_syscall(x) asm(".weak\t" VMLINUX_SYMBOL_STR(x) "\n\t" \
#define __SYMBOL_PREFIX CONFIG_SYMBOL_PREFIX ".set\t" VMLINUX_SYMBOL_STR(x) "," \
#else VMLINUX_SYMBOL_STR(sys_ni_syscall))
#define __SYMBOL_PREFIX
#endif
#define cond_syscall(x) asm(".weak\t" __SYMBOL_PREFIX #x "\n\t" \
".set\t" __SYMBOL_PREFIX #x "," \
__SYMBOL_PREFIX "sys_ni_syscall")
#endif #endif
...@@ -52,13 +52,7 @@ ...@@ -52,13 +52,7 @@
#define LOAD_OFFSET 0 #define LOAD_OFFSET 0
#endif #endif
#ifndef SYMBOL_PREFIX #include <linux/export.h>
#define VMLINUX_SYMBOL(sym) sym
#else
#define PASTE2(x,y) x##y
#define PASTE(x,y) PASTE2(x,y)
#define VMLINUX_SYMBOL(sym) PASTE(SYMBOL_PREFIX, sym)
#endif
/* Align . to a 8 byte boundary equals to maximum function alignment. */ /* Align . to a 8 byte boundary equals to maximum function alignment. */
#define ALIGN_FUNCTION() . = ALIGN(8) #define ALIGN_FUNCTION() . = ALIGN(8)
......
...@@ -5,17 +5,24 @@ ...@@ -5,17 +5,24 @@
* to reduce the amount of pointless cruft we feed to gcc when only * to reduce the amount of pointless cruft we feed to gcc when only
* exporting a simple symbol or two. * exporting a simple symbol or two.
* *
* If you feel the need to add #include <linux/foo.h> to this file * Try not to add #includes here. It slows compilation and makes kernel
* then you are doing something wrong and should go away silently. * hackers place grumpy comments in header files.
*/ */
/* Some toolchains use a `_' prefix for all user symbols. */ /* Some toolchains use a `_' prefix for all user symbols. */
#ifdef CONFIG_SYMBOL_PREFIX #ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
#define MODULE_SYMBOL_PREFIX CONFIG_SYMBOL_PREFIX #define __VMLINUX_SYMBOL(x) _##x
#define __VMLINUX_SYMBOL_STR(x) "_" #x
#else #else
#define MODULE_SYMBOL_PREFIX "" #define __VMLINUX_SYMBOL(x) x
#define __VMLINUX_SYMBOL_STR(x) #x
#endif #endif
/* Indirect, so macros are expanded before pasting. */
#define VMLINUX_SYMBOL(x) __VMLINUX_SYMBOL(x)
#define VMLINUX_SYMBOL_STR(x) __VMLINUX_SYMBOL_STR(x)
#ifndef __ASSEMBLY__
struct kernel_symbol struct kernel_symbol
{ {
unsigned long value; unsigned long value;
...@@ -51,7 +58,7 @@ extern struct module __this_module; ...@@ -51,7 +58,7 @@ extern struct module __this_module;
__CRC_SYMBOL(sym, sec) \ __CRC_SYMBOL(sym, sec) \
static const char __kstrtab_##sym[] \ static const char __kstrtab_##sym[] \
__attribute__((section("__ksymtab_strings"), aligned(1))) \ __attribute__((section("__ksymtab_strings"), aligned(1))) \
= MODULE_SYMBOL_PREFIX #sym; \ = VMLINUX_SYMBOL_STR(sym); \
static const struct kernel_symbol __ksymtab_##sym \ static const struct kernel_symbol __ksymtab_##sym \
__used \ __used \
__attribute__((section("___ksymtab" sec "+" #sym), unused)) \ __attribute__((section("___ksymtab" sec "+" #sym), unused)) \
...@@ -85,5 +92,6 @@ extern struct module __this_module; ...@@ -85,5 +92,6 @@ extern struct module __this_module;
#define EXPORT_UNUSED_SYMBOL_GPL(sym) #define EXPORT_UNUSED_SYMBOL_GPL(sym)
#endif /* CONFIG_MODULES */ #endif /* CONFIG_MODULES */
#endif /* !__ASSEMBLY__ */
#endif /* _LINUX_EXPORT_H */ #endif /* _LINUX_EXPORT_H */
...@@ -723,13 +723,6 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { } ...@@ -723,13 +723,6 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }
/* Trap pasters of __FUNCTION__ at compile-time */ /* Trap pasters of __FUNCTION__ at compile-time */
#define __FUNCTION__ (__func__) #define __FUNCTION__ (__func__)
/* This helps us to avoid #ifdef CONFIG_SYMBOL_PREFIX */
#ifdef CONFIG_SYMBOL_PREFIX
#define SYMBOL_PREFIX CONFIG_SYMBOL_PREFIX
#else
#define SYMBOL_PREFIX ""
#endif
/* Rebuild everything on CONFIG_FTRACE_MCOUNT_RECORD */ /* Rebuild everything on CONFIG_FTRACE_MCOUNT_RECORD */
#ifdef CONFIG_FTRACE_MCOUNT_RECORD #ifdef CONFIG_FTRACE_MCOUNT_RECORD
# define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD # define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD
......
...@@ -190,7 +190,7 @@ extern int modules_disabled; /* for sysctl */ ...@@ -190,7 +190,7 @@ extern int modules_disabled; /* for sysctl */
/* Get/put a kernel symbol (calls must be symmetric) */ /* Get/put a kernel symbol (calls must be symmetric) */
void *__symbol_get(const char *symbol); void *__symbol_get(const char *symbol);
void *__symbol_get_gpl(const char *symbol); void *__symbol_get_gpl(const char *symbol);
#define symbol_get(x) ((typeof(&x))(__symbol_get(MODULE_SYMBOL_PREFIX #x))) #define symbol_get(x) ((typeof(&x))(__symbol_get(VMLINUX_SYMBOL_STR(x))))
/* modules using other modules: kdb wants to see this. */ /* modules using other modules: kdb wants to see this. */
struct module_use { struct module_use {
...@@ -453,7 +453,7 @@ extern void __module_put_and_exit(struct module *mod, long code) ...@@ -453,7 +453,7 @@ extern void __module_put_and_exit(struct module *mod, long code)
#ifdef CONFIG_MODULE_UNLOAD #ifdef CONFIG_MODULE_UNLOAD
unsigned long module_refcount(struct module *mod); unsigned long module_refcount(struct module *mod);
void __symbol_put(const char *symbol); void __symbol_put(const char *symbol);
#define symbol_put(x) __symbol_put(MODULE_SYMBOL_PREFIX #x) #define symbol_put(x) __symbol_put(VMLINUX_SYMBOL_STR(x))
void symbol_put_addr(void *addr); void symbol_put_addr(void *addr);
/* Sometimes we know we already have a refcount, and it's easier not /* Sometimes we know we already have a refcount, and it's easier not
......
/* SYMBOL_PREFIX defined on commandline from CONFIG_SYMBOL_PREFIX */ #include <linux/export.h>
#ifndef SYMBOL_PREFIX
#define ASM_SYMBOL(sym) sym
#else
#define PASTE2(x,y) x##y
#define PASTE(x,y) PASTE2(x,y)
#define ASM_SYMBOL(sym) PASTE(SYMBOL_PREFIX, sym)
#endif
#define GLOBAL(name) \ #define GLOBAL(name) \
.globl ASM_SYMBOL(name); \ .globl VMLINUX_SYMBOL(name); \
ASM_SYMBOL(name): VMLINUX_SYMBOL(name):
.section ".init.data","aw" .section ".init.data","aw"
......
...@@ -1209,7 +1209,7 @@ static inline int check_modstruct_version(Elf_Shdr *sechdrs, ...@@ -1209,7 +1209,7 @@ static inline int check_modstruct_version(Elf_Shdr *sechdrs,
/* Since this should be found in kernel (which can't be removed), /* Since this should be found in kernel (which can't be removed),
* no locking is necessary. */ * no locking is necessary. */
if (!find_symbol(MODULE_SYMBOL_PREFIX "module_layout", NULL, if (!find_symbol(VMLINUX_SYMBOL_STR(module_layout), NULL,
&crc, true, false)) &crc, true, false))
BUG(); BUG();
return check_version(sechdrs, versindex, "module_layout", mod, crc, return check_version(sechdrs, versindex, "module_layout", mod, crc,
......
...@@ -119,13 +119,6 @@ _c_flags += $(if $(patsubst n%,, \ ...@@ -119,13 +119,6 @@ _c_flags += $(if $(patsubst n%,, \
$(CFLAGS_GCOV)) $(CFLAGS_GCOV))
endif endif
ifdef CONFIG_SYMBOL_PREFIX
_sym_flags = -DSYMBOL_PREFIX=$(patsubst "%",%,$(CONFIG_SYMBOL_PREFIX))
_cpp_flags += $(_sym_flags)
_a_flags += $(_sym_flags)
endif
# If building the kernel in a separate objtree expand all occurrences # If building the kernel in a separate objtree expand all occurrences
# of -Idir to -I$(srctree)/dir except for absolute paths (starting with '/'). # of -Idir to -I$(srctree)/dir except for absolute paths (starting with '/').
......
...@@ -74,9 +74,8 @@ kallsyms() ...@@ -74,9 +74,8 @@ kallsyms()
info KSYM ${2} info KSYM ${2}
local kallsymopt; local kallsymopt;
if [ -n "${CONFIG_SYMBOL_PREFIX}" ]; then if [ -n "${CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX}" ]; then
kallsymopt="${kallsymopt} \ kallsymopt="${kallsymopt} --symbol-prefix=_"
--symbol-prefix=${CONFIG_SYMBOL_PREFIX}"
fi fi
if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then
......
...@@ -18,14 +18,7 @@ ...@@ -18,14 +18,7 @@
#include "modpost.h" #include "modpost.h"
#include "../../include/generated/autoconf.h" #include "../../include/generated/autoconf.h"
#include "../../include/linux/license.h" #include "../../include/linux/license.h"
#include "../../include/linux/export.h"
/* Some toolchains use a `_' prefix for all user symbols. */
#ifdef CONFIG_SYMBOL_PREFIX
#define MODULE_SYMBOL_PREFIX CONFIG_SYMBOL_PREFIX
#else
#define MODULE_SYMBOL_PREFIX ""
#endif
/* Are we using CONFIG_MODVERSIONS? */ /* Are we using CONFIG_MODVERSIONS? */
int modversions = 0; int modversions = 0;
...@@ -562,7 +555,7 @@ static void parse_elf_finish(struct elf_info *info) ...@@ -562,7 +555,7 @@ static void parse_elf_finish(struct elf_info *info)
static int ignore_undef_symbol(struct elf_info *info, const char *symname) static int ignore_undef_symbol(struct elf_info *info, const char *symname)
{ {
/* ignore __this_module, it will be resolved shortly */ /* ignore __this_module, it will be resolved shortly */
if (strcmp(symname, MODULE_SYMBOL_PREFIX "__this_module") == 0) if (strcmp(symname, VMLINUX_SYMBOL_STR(__this_module)) == 0)
return 1; return 1;
/* ignore global offset table */ /* ignore global offset table */
if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0) if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0)
...@@ -583,8 +576,8 @@ static int ignore_undef_symbol(struct elf_info *info, const char *symname) ...@@ -583,8 +576,8 @@ static int ignore_undef_symbol(struct elf_info *info, const char *symname)
return 0; return 0;
} }
#define CRC_PFX MODULE_SYMBOL_PREFIX "__crc_" #define CRC_PFX VMLINUX_SYMBOL_STR(__crc_)
#define KSYMTAB_PFX MODULE_SYMBOL_PREFIX "__ksymtab_" #define KSYMTAB_PFX VMLINUX_SYMBOL_STR(__ksymtab_)
static void handle_modversions(struct module *mod, struct elf_info *info, static void handle_modversions(struct module *mod, struct elf_info *info,
Elf_Sym *sym, const char *symname) Elf_Sym *sym, const char *symname)
...@@ -637,14 +630,15 @@ static void handle_modversions(struct module *mod, struct elf_info *info, ...@@ -637,14 +630,15 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
} }
#endif #endif
if (memcmp(symname, MODULE_SYMBOL_PREFIX, #ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
strlen(MODULE_SYMBOL_PREFIX)) == 0) { if (symname[0] != '_')
mod->unres = break;
alloc_symbol(symname + else
strlen(MODULE_SYMBOL_PREFIX), symname++;
ELF_ST_BIND(sym->st_info) == STB_WEAK, #endif
mod->unres); mod->unres = alloc_symbol(symname,
} ELF_ST_BIND(sym->st_info) == STB_WEAK,
mod->unres);
break; break;
default: default:
/* All exported symbols */ /* All exported symbols */
...@@ -652,9 +646,9 @@ static void handle_modversions(struct module *mod, struct elf_info *info, ...@@ -652,9 +646,9 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
sym_add_exported(symname + strlen(KSYMTAB_PFX), mod, sym_add_exported(symname + strlen(KSYMTAB_PFX), mod,
export); export);
} }
if (strcmp(symname, MODULE_SYMBOL_PREFIX "init_module") == 0) if (strcmp(symname, VMLINUX_SYMBOL_STR(init_module)) == 0)
mod->has_init = 1; mod->has_init = 1;
if (strcmp(symname, MODULE_SYMBOL_PREFIX "cleanup_module") == 0) if (strcmp(symname, VMLINUX_SYMBOL_STR(cleanup_module)) == 0)
mod->has_cleanup = 1; mod->has_cleanup = 1;
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment