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

Laurent Dufour ldufour at linux.vnet.ibm.com
Mon Oct 5 09:44:27 PDT 2015


On 05/10/2015 17:30, Christopher Covington wrote:
> Hi Laurent,
> 
> On 10/05/2015 10:54 AM, Laurent Dufour wrote:
>> 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.
> 
> Sorry about that. Here are some thoughts:
> 
> A) #ifdefs
> 
> Ideally with some comments and only temporary until we work out a more
> satisfactory solution.
> 
> B) Keep the declaration local but make it static const instead of just const
> 
> You've probably already seen this, but this approach is mentioned in the
> comments here:
> http://stackoverflow.com/questions/6410595/getting-gcc-to-compile-without-inserting-call-to-memcpy

This works for me, but I would be surprised that it works on ARM without
any relocation in place. Isn't it ?

> 
> C) Pack multiple strings into a single char* that's double-null terminated
> 
> Use while() instead of for(), etc.

Not very sexy.

> 
> D) Port piegen to AArch64
> 
> I'd like to do this at some point, if only as an exercise to learn more about
> ELF and AArch64, but I'm not sure I'll have to the time to do it in the next
> few weeks.

I guess at one time this will be required, because there are other place
where such a declaration could be made.

There is another option :
E) Pn powerPC, since the compiler relies on memcpy to set the data in
the stack, define a memcpy service in vdso-pie.c. This way even if there
are other similar declaration, this should work.

I think I will implement the option E) even if B) works fine on power,
this may be convenient in the future.

Laurent.


> 
> Christopher Covington
> 
>>> 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;
>>>
>>
> 
> 

  * Anglais - détecté
  * Français
  * Anglais

  * Français
  * Anglais

 <javascript:void(0);>

 <#>



More information about the CRIU mailing list