[Acked] [PATCH Yakkety SRU] Revert "Revert "powerpc: Simplify module TOC handling""
Andy Whitcroft
apw at canonical.com
Tue Oct 4 14:07:28 UTC 2016
On Mon, Oct 03, 2016 at 09:43:47AM -0600, Tim Gardner wrote:
> BugLink: http://bugs.launchpad.net/bugs/1628968
>
> This reverts commit c3e101c66fcea73fce1e18a61b58129c24da127f.
>
> This patch fixes a failure to load modules on powerpc-generic.
>
> Signed-off-by: Tim Gardner <tim.gardner at canonical.com>
> ---
> arch/powerpc/kernel/misc_64.S | 28 ----------------------------
> arch/powerpc/kernel/module_64.c | 14 ++++++++++----
> scripts/mod/modpost.c | 3 ++-
> 3 files changed, 12 insertions(+), 33 deletions(-)
>
> diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S
> index d6d1b8b..cb19515 100644
> --- a/arch/powerpc/kernel/misc_64.S
> +++ b/arch/powerpc/kernel/misc_64.S
> @@ -701,31 +701,3 @@ _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 e02ab6f..183368e 100644
> --- a/arch/powerpc/kernel/module_64.c
> +++ b/arch/powerpc/kernel/module_64.c
> @@ -297,7 +297,10 @@ static void dedotify_versions(struct modversion_info *vers,
> }
> }
>
> -/* Undefined symbols which refer to .funcname, hack to funcname (or .TOC.) */
> +/*
> + * Undefined symbols which refer to .funcname, hack to funcname. Make .TOC.
> + * seem to be defined (value set later).
> + */
> static void dedotify(Elf64_Sym *syms, unsigned int numsyms, char *strtab)
> {
> unsigned int i;
> @@ -305,8 +308,11 @@ 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] == '.')
> - memmove(name, name+1, strlen(name));
> + if (name[0] == '.') {
> + if (strcmp(name+1, "TOC.") == 0)
> + syms[i].st_shndx = SHN_ABS;
> + syms[i].st_name++;
> + }
> }
> }
> }
> @@ -322,7 +328,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_UNDEF
> + if (syms[i].st_shndx == SHN_ABS
> && strcmp(strtab + syms[i].st_name, "TOC.") == 0)
> return &syms[i];
> }
> diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
> index e080746..48958d3 100644
> --- a/scripts/mod/modpost.c
> +++ b/scripts/mod/modpost.c
> @@ -594,7 +594,8 @@ 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)
> + strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0 ||
> + strcmp(symname, ".TOC.") == 0)
> return 1;
> /* Do not ignore this symbol */
> return 0;
> --
> 2.7.4
>
>
> --
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
Acked-by: Andy Whitcroft <apw at canonical.com>
-apw
More information about the kernel-team
mailing list