This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Compile elf/rtld.c with -fno-tree-loop-distribute-patterns.



On 25/11/2019 17:05, Florian Weimer wrote:
> * Adhemerval Zanella:
> 
>> We already have a similar code to handle a similar issue:
>>
>>  484   /* Partly clean the `bootstrap_map' structure up.  Don't use
>>  485      `memset' since it might not be built in or inlined and we cannot
>>  486      make function calls at this point.  Use '__builtin_memset' if we
>>  487      know it is available.  We do not have to clear the memory if we
>>  488      do not have to use the temporary bootstrap_map.  Global variables
>>  489      are initialized to zero by default.  */
>>  490 #ifndef DONT_USE_BOOTSTRAP_MAP
>>  491 # ifdef HAVE_BUILTIN_MEMSET
>>  492 __builtin_memset (bootstrap_map.l_info, '\0', sizeof
>> (bootstrap_map.l_info));
>>  493 # else
>>  494   for (size_t cnt = 0;
>>  495 cnt < sizeof (bootstrap_map.l_info) / sizeof
>> (bootstrap_map.l_info[0]);
>>  496        ++cnt)
>>  497     bootstrap_map.l_info[cnt] = 0;
>>  498 # endif
>>  499 #endif
>>
>> The HAVE_BUILTIN_MEMSET on configure.ac check if __builtin_memset itself
>> calls memset and it is within DONT_USE_BOOTSTRAP_MAP mainly because it is
>> stack allocated for !PI_STATIC_AND_HIDDEN.
>>
>> (As a side-note, I really think these kind of micro-optimization is just
>> over-complicate for minimal gain)
>>
>> However, I am not sure there is really a restriction regarding
>> PI_STATIC_AND_HIDDEN and internal function calls.  Just after this memset
>> call it has:
>>
>>  516 if (bootstrap_map.l_addr || !
>> bootstrap_map.l_info[VALIDX(DT_GNU_PRELINKED)])
>>  517     { 
>>  518 /* Relocate ourselves so we can do normal function calls and
>>  519 data access using the global offset table.  */
>>  520       
>>  521 ELF_DYNAMIC_RELOCATE (&bootstrap_map, 0, 0, 0);
>>  522     }
>>  523   bootstrap_map.l_relocated = 1; 
>>
>> So it should be safe to call memcpy/memset calls in _dl_start after this
>> point (as some ports that with !PI_STATIC_AND_HIDDEN does with memcpy) .
>> Is gcc creating a mem* calls before ld.so reallocate itself? If it were, 
>> where exactly?
> 
> In the code you quoted.  It reintroduces the memset call we so
> carefully tried to remove.
> 

Sigh... The dl_start_final_info struct is roughly 660 bytes (664 on powerpc
for instance, slight larger on mips). I wonder if we could just create a
static global on rtld.c to simplify it, since the stack usage won't be
released anyway. Also, isn't the memset on !DONT_USE_BOOTSTRAP_MAP redundant?


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]