[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