104 lines
3.4 KiB
Diff
104 lines
3.4 KiB
Diff
From b66e7caab9e6634dadce2aced6e174c095e1ca0e Mon Sep 17 00:00:00 2001
|
|
From: Peter Robinson <pbrobinson@gmail.com>
|
|
Date: Tue, 9 Feb 2016 15:00:02 +0000
|
|
Subject: [PATCH] Revert "powerpc: Simplify module TOC handling"
|
|
|
|
This reverts commit c153693d7eb9eeb28478aa2deaaf0b4e7b5ff5e9.
|
|
---
|
|
arch/powerpc/kernel/misc_64.S | 28 ++++++++++++++++++++++++++++
|
|
arch/powerpc/kernel/module_64.c | 12 +++---------
|
|
scripts/mod/modpost.c | 3 +--
|
|
3 files changed, 32 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S
|
|
index f28754c..db475d4 100644
|
|
--- a/arch/powerpc/kernel/misc_64.S
|
|
+++ b/arch/powerpc/kernel/misc_64.S
|
|
@@ -701,3 +701,31 @@ _GLOBAL(kexec_sequence)
|
|
li r5,0
|
|
blr /* image->start(physid, image->start, 0); */
|
|
#endif /* CONFIG_KEXEC */
|
|
+
|
|
+#ifdef CONFIG_MODULES
|
|
+#if defined(_CALL_ELF) && _CALL_ELF == 2
|
|
+
|
|
+#ifdef CONFIG_MODVERSIONS
|
|
+.weak __crc_TOC.
|
|
+.section "___kcrctab+TOC.","a"
|
|
+.globl __kcrctab_TOC.
|
|
+__kcrctab_TOC.:
|
|
+ .llong __crc_TOC.
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * Export a fake .TOC. since both modpost and depmod will complain otherwise.
|
|
+ * Both modpost and depmod strip the leading . so we do the same here.
|
|
+ */
|
|
+.section "__ksymtab_strings","a"
|
|
+__kstrtab_TOC.:
|
|
+ .asciz "TOC."
|
|
+
|
|
+.section "___ksymtab+TOC.","a"
|
|
+/* This symbol name is important: it's used by modpost to find exported syms */
|
|
+.globl __ksymtab_TOC.
|
|
+__ksymtab_TOC.:
|
|
+ .llong 0 /* .value */
|
|
+ .llong __kstrtab_TOC.
|
|
+#endif /* ELFv2 */
|
|
+#endif /* MODULES */
|
|
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c
|
|
index ac64ffd..59663af 100644
|
|
--- a/arch/powerpc/kernel/module_64.c
|
|
+++ b/arch/powerpc/kernel/module_64.c
|
|
@@ -326,10 +326,7 @@ static void dedotify_versions(struct modversion_info *vers,
|
|
}
|
|
}
|
|
|
|
-/*
|
|
- * Undefined symbols which refer to .funcname, hack to funcname. Make .TOC.
|
|
- * seem to be defined (value set later).
|
|
- */
|
|
+/* Undefined symbols which refer to .funcname, hack to funcname (or .TOC.) */
|
|
static void dedotify(Elf64_Sym *syms, unsigned int numsyms, char *strtab)
|
|
{
|
|
unsigned int i;
|
|
@@ -337,11 +334,8 @@ static void dedotify(Elf64_Sym *syms, unsigned int numsyms, char *strtab)
|
|
for (i = 1; i < numsyms; i++) {
|
|
if (syms[i].st_shndx == SHN_UNDEF) {
|
|
char *name = strtab + syms[i].st_name;
|
|
- if (name[0] == '.') {
|
|
- if (strcmp(name+1, "TOC.") == 0)
|
|
- syms[i].st_shndx = SHN_ABS;
|
|
+ if (name[0] == '.')
|
|
memmove(name, name+1, strlen(name));
|
|
- }
|
|
}
|
|
}
|
|
}
|
|
@@ -357,7 +351,7 @@ static Elf64_Sym *find_dot_toc(Elf64_Shdr *sechdrs,
|
|
numsyms = sechdrs[symindex].sh_size / sizeof(Elf64_Sym);
|
|
|
|
for (i = 1; i < numsyms; i++) {
|
|
- if (syms[i].st_shndx == SHN_ABS
|
|
+ if (syms[i].st_shndx == SHN_UNDEF
|
|
&& strcmp(strtab + syms[i].st_name, "TOC.") == 0)
|
|
return &syms[i];
|
|
}
|
|
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
|
|
index 48958d3..e080746 100644
|
|
--- a/scripts/mod/modpost.c
|
|
+++ b/scripts/mod/modpost.c
|
|
@@ -594,8 +594,7 @@ static int ignore_undef_symbol(struct elf_info *info, const char *symname)
|
|
if (strncmp(symname, "_restgpr0_", sizeof("_restgpr0_") - 1) == 0 ||
|
|
strncmp(symname, "_savegpr0_", sizeof("_savegpr0_") - 1) == 0 ||
|
|
strncmp(symname, "_restvr_", sizeof("_restvr_") - 1) == 0 ||
|
|
- strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0 ||
|
|
- strcmp(symname, ".TOC.") == 0)
|
|
+ strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0)
|
|
return 1;
|
|
/* Do not ignore this symbol */
|
|
return 0;
|
|
--
|
|
2.5.0
|
|
|