[PATCH v2] elf: Add optimization barrier for __ehdr_start and _end
Florian Weimer
fweimer@redhat.com
Mon Jun 16 05:48:16 GMT 2025
* H. J. Lu:
> On Mon, Jun 16, 2025 at 12:55 PM Florian Weimer <fweimer@redhat.com> wrote:
>>
>> * H. J. Lu:
>>
>> > diff --git a/elf/rtld.c b/elf/rtld.c
>> > index 8e8f0e6253..e6a181dc31 100644
>> > --- a/elf/rtld.c
>> > +++ b/elf/rtld.c
>> > @@ -477,7 +477,10 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
>> > _dl_setup_hash (&_dl_rtld_map);
>> > _dl_rtld_map.l_real = &_dl_rtld_map;
>> > _dl_rtld_map.l_map_start = (ElfW(Addr)) &__ehdr_start;
>> > + /* Prevent run-time relocations against __ehdr_start and _end. */
>> > + asm ("" : "+g" (_dl_rtld_map.l_map_start));
>> > _dl_rtld_map.l_map_end = (ElfW(Addr)) _end;
>> > + asm ("" : "+g" (_dl_rtld_map.l_map_end));
>> > /* Copy the TLS related data if necessary. */
>> > #ifndef DONT_USE_BOOTSTRAP_MAP
>> > # if NO_TLS_OFFSET != 0
>>
>> This needs a better comment about why we are doing this, and exactly how
>> it prevents this problem.
>
> How about
>
> Prevent compiler vectorizer from loading hidden variables into vector registers.
It doesn't say why "g" is the appropriate constraint here.
Should we turn this into a macro, so that each architecture can tweak
this according to its needs?
>> However, I think x86 without -mgeneral-regs-only simply is a
>> HIDDEN_VAR_NEEDS_DYNAMIC_RELOC architecture because GCC uses dynamic
>> relocations against hidden or static objects to load pointers into
>> vector registers (and that's exactly what HIDDEN_VAR_NEEDS_DYNAMIC_RELOC
>> is about).
>
> True only if GCC loads hidden variables into vector registers.
Yes, and I think we need -mgeneral-regs-only to reliably prevent that.
>> Should we build elf/rtld.c with -mgeneral-regs-only? As far as I can
>> see, it solves the issue, and it does not need GCC changes.
>>
>
> Vector instructions are OK in rtld.c:
For the most part, yes, but are they in performance-critical code?
If we do not use -mgeneral-regs-only, there is bound to be another
combination of compiler option that tries to load pointers directly into
vector registers before initial self-relocation.
Thanks,
Florian
More information about the Libc-alpha
mailing list