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: Rusty Russell <rusty@rustcorp.com.au> Reviewed-by: James Hogan <james.hogan@imgtec.com> Tested-by: James Hogan <james.hogan@imgtec.com> (metag)
This commit is contained in:
@@ -18,14 +18,7 @@
|
||||
#include "modpost.h"
|
||||
#include "../../include/generated/autoconf.h"
|
||||
#include "../../include/linux/license.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
|
||||
|
||||
#include "../../include/linux/export.h"
|
||||
|
||||
/* Are we using CONFIG_MODVERSIONS? */
|
||||
int modversions = 0;
|
||||
@@ -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)
|
||||
{
|
||||
/* 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;
|
||||
/* ignore global offset table */
|
||||
if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0)
|
||||
@@ -583,8 +576,8 @@ static int ignore_undef_symbol(struct elf_info *info, const char *symname)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define CRC_PFX MODULE_SYMBOL_PREFIX "__crc_"
|
||||
#define KSYMTAB_PFX MODULE_SYMBOL_PREFIX "__ksymtab_"
|
||||
#define CRC_PFX VMLINUX_SYMBOL_STR(__crc_)
|
||||
#define KSYMTAB_PFX VMLINUX_SYMBOL_STR(__ksymtab_)
|
||||
|
||||
static void handle_modversions(struct module *mod, struct elf_info *info,
|
||||
Elf_Sym *sym, const char *symname)
|
||||
@@ -637,14 +630,15 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
|
||||
}
|
||||
#endif
|
||||
|
||||
if (memcmp(symname, MODULE_SYMBOL_PREFIX,
|
||||
strlen(MODULE_SYMBOL_PREFIX)) == 0) {
|
||||
mod->unres =
|
||||
alloc_symbol(symname +
|
||||
strlen(MODULE_SYMBOL_PREFIX),
|
||||
ELF_ST_BIND(sym->st_info) == STB_WEAK,
|
||||
mod->unres);
|
||||
}
|
||||
#ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
|
||||
if (symname[0] != '_')
|
||||
break;
|
||||
else
|
||||
symname++;
|
||||
#endif
|
||||
mod->unres = alloc_symbol(symname,
|
||||
ELF_ST_BIND(sym->st_info) == STB_WEAK,
|
||||
mod->unres);
|
||||
break;
|
||||
default:
|
||||
/* All exported symbols */
|
||||
@@ -652,9 +646,9 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
|
||||
sym_add_exported(symname + strlen(KSYMTAB_PFX), mod,
|
||||
export);
|
||||
}
|
||||
if (strcmp(symname, MODULE_SYMBOL_PREFIX "init_module") == 0)
|
||||
if (strcmp(symname, VMLINUX_SYMBOL_STR(init_module)) == 0)
|
||||
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;
|
||||
break;
|
||||
}
|
||||
|
Reference in New Issue
Block a user