[PATCH] elf: Do not read hwcaps from the vDSO in ld.so

Adhemerval Zanella adhemerval.zanella@linaro.org
Tue May 26 13:54:41 GMT 2020



On 26/05/2020 10:47, Florian Weimer wrote:
> * Adhemerval Zanella via Libc-alpha:
> 
>> On 19/05/2020 14:06, Florian Weimer via Libc-alpha wrote:
>>> This was only ever used for the "nosegneg" flag.  This approach for
>>> passing hardware capability information creates a subtle dependency
>>> between the kernel and userspace, and ld.so.cache contents.  It seems
>>> inappropriate for toady, where people expect to be able to run
>>> system images which very different kernel versions.
>>
>> I agree that such dependency is not suitable for current practices and
>> environment where glibc is used. From digging the history of "nosegneg" 
>> flag it seemed a hack around some issue or limitation from XEN kernels. 
>> Do you have more information of what exactly nosegneg tried to prevent?
> 
> It used to select a glibc built with -mno-tls-direct-seg-refs.  Not
> doing complicated address calculations in segment-based accesses somehow
> simplified things for Xen with paravirtualization.  Our notes indicate
> that this was caused by negative segment-relative references, so
> -mno-tls-direct-seg-refs was likely too big a hammer.

Is it still a valid build option for either glibc or programs targetting
glibc?

> 
> In practice, this matters only in very few places in glibc where we
> access TLS variables that are *not* in the TCB or the thread descriptor,
> because those are at positive offsets.
> 
> An example would look like this:
> 
> Dump of assembler code for function __syscall_error:
>    0x0001f090 <+0>:	endbr32 
>    0x0001f094 <+4>:	call   0x132b41 <__x86.get_pc_thunk.dx>
>    0x0001f099 <+9>:	add    $0x18cd8b,%edx
>    0x0001f09f <+15>:	neg    %eax
>    0x0001f0a1 <+17>:	mov    0xdc(%edx),%edx
>    0x0001f0a7 <+23>:	mov    %eax,%gs:(%edx)
>    0x0001f0aa <+26>:	mov    $0xffffffff,%eax
>    0x0001f0af <+31>:	ret    
> 
> At the point of the %gs-relative load, %edx is negative because that's
> where the TLS variables are.
> 
> With a little bit of care, the performance benefits would likely have
> been achievable without a separate glibc build.

Thanks for the explanation, I tried to dig this rationale without
much success.

> 
>> LGTM, thanks.
>>
>> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> 
> Thanks.
> 
> Florian
> 


More information about the Libc-alpha mailing list