[CRIU] [PATCH] pie: Give VDSO symbol table local scope

Laurent Dufour ldufour at linux.vnet.ibm.com
Mon Oct 5 07:54:40 PDT 2015


On 03/10/2015 14:47, Christopher Covington wrote:
> In commit c2271198, Laurent Dufour kindly reunified the VDSO code
> that had become duplicated between architectures. Unfortunately
> this introduced a regression in AArch64 where apparently due to
> the scope of vdso_symbols array of pointers to characters changing
> from local to global, load-time relocations became necessary.
> 
> The following thread on the GCC mailing list discusses why
> load-time relocations can be necessary when pointers are used,
> although it doesn't mention the potential for locally scoped
> arrays to be handled differently:
> https://gcc.gnu.org/ml/gcc/2004-05/msg01016.html
> 
> Because the alternatives, such as porting piegen to AArch64, are
> far more involved, simply revert the change in scope.

Hi Christopher,

This breaks the build on powerpc due to the gcc optimisation done on power.

On power the compiler is calling C library memcpy to copy the
pre-initialised. This leads to an undefined memcpy symbol when building
the parasite part.
I'm looking at the best way to get around that.

> 
> Signed-off-by: Christopher Covington <cov at codeaurora.org>
> ---
>  include/util-vdso.h | 4 ----
>  pie/util-vdso.c     | 8 ++++----
>  2 files changed, 4 insertions(+), 8 deletions(-)
> 
> diff --git a/include/util-vdso.h b/include/util-vdso.h
> index 2942337..c8dfa05 100644
> --- a/include/util-vdso.h
> +++ b/include/util-vdso.h
> @@ -60,10 +60,6 @@ static inline unsigned long vvar_vma_size(struct vdso_symtable *t)
>  	return t->vvar_end - t->vvar_start;
>  }
> 
> -extern const char *vdso_symbols[VDSO_SYMBOL_MAX];
> -
>  extern int vdso_fill_symtable(char *mem, size_t size, struct vdso_symtable *t);
> 
> -
> -
>  #endif /* __CR_UTIL_VDSO_H__ */
> diff --git a/pie/util-vdso.c b/pie/util-vdso.c
> index 9711aaa..65746d9 100644
> --- a/pie/util-vdso.c
> +++ b/pie/util-vdso.c
> @@ -24,10 +24,6 @@
>  #endif
>  #define LOG_PREFIX "vdso: "
> 
> -const char *vdso_symbols[VDSO_SYMBOL_MAX] = {
> -	ARCH_VDSO_SYMBOLS
> -};
> -
>  /* Check if pointer is out-of-bound */
>  static bool __ptr_oob(void *ptr, void *start, size_t size)
>  {
> @@ -54,6 +50,10 @@ static unsigned long elf_hash(const unsigned char *name)
> 
>  int vdso_fill_symtable(char *mem, size_t size, struct vdso_symtable *t)
>  {
> +	const char *vdso_symbols[VDSO_SYMBOL_MAX] = {
> +		ARCH_VDSO_SYMBOLS
> +	};
> +
>  	Elf64_Phdr *dynamic = NULL, *load = NULL;
>  	Elf64_Ehdr *ehdr = (void *)mem;
>  	Elf64_Dyn *dyn_strtab = NULL;
> 



More information about the CRIU mailing list