Message ID | 20211101202334.1026714-1-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | [v2] elf: Assume disjointed .rela.dyn and .rela.plt for loader | expand |
On Mon, Nov 1, 2021 at 1:23 PM Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > > The patch removes the the ELF_DURING_STARTUP optimization and assume > both .rel.dyn and .rel.plt might not be subsequent. This allows some > code simplification since relocation will be handled independently > where it is done on bootstrap. > > At least on x86_64_64, I can not measure any performance implications. > Running 10000 time the command > > LD_DEBUG=statistics ./elf/ld.so ./libc.so > > And filtering the "total startup time in dynamic loader" result, > the geometric mean is: > > patched master > Ryzen 7 5900x 24140 24952 > i7-4510U 45957 45982 > > (The results do show some variation, I did not make any statistical > analysis). > > It also allows build arm with lld, since it inserts ".ARM.exidx" > between ".rel.dyn" and ".rel.plt" for the loader. > > Checked on x86_64-linux-gnu and arm-linux-gnueabihf. > --- > elf/dynamic-link.h | 32 +++++++++----------------------- > 1 file changed, 9 insertions(+), 23 deletions(-) > > diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h > index ac4cc70dea..f619615e5c 100644 > --- a/elf/dynamic-link.h > +++ b/elf/dynamic-link.h > @@ -65,12 +65,6 @@ elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[], > > #ifdef RESOLVE_MAP > > -# if defined RTLD_BOOTSTRAP || defined STATIC_PIE_BOOTSTRAP > -# define ELF_DURING_STARTUP (1) > -# else > -# define ELF_DURING_STARTUP (0) > -# endif > - > /* Get the definitions of `elf_dynamic_do_rel' and `elf_dynamic_do_rela'. > These functions are almost identical, so we use cpp magic to avoid > duplicating their code. It cannot be done in a more general function > @@ -106,9 +100,8 @@ elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[], > \ > if (ranges[0].start + ranges[0].size == (start + size)) \ > ranges[0].size -= size; \ > - if (ELF_DURING_STARTUP \ > - || (!(do_lazy) \ > - && (ranges[0].start + ranges[0].size) == start)) \ > + if (!(do_lazy) \ > + && (ranges[0].start + ranges[0].size) == start) \ > { \ > /* Combine processing the sections. */ \ > ranges[0].size += size; \ > @@ -121,20 +114,13 @@ elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[], > } \ > } \ > \ > - if (ELF_DURING_STARTUP) \ > - elf_dynamic_do_##reloc ((map), scope, ranges[0].start, ranges[0].size, \ > - ranges[0].nrelative, 0, skip_ifunc); \ > - else \ > - { \ > - int ranges_index; \ > - for (ranges_index = 0; ranges_index < 2; ++ranges_index) \ > - elf_dynamic_do_##reloc ((map), scope, \ > - ranges[ranges_index].start, \ > - ranges[ranges_index].size, \ > - ranges[ranges_index].nrelative, \ > - ranges[ranges_index].lazy, \ > - skip_ifunc); \ > - } \ > + for (int ranges_index = 0; ranges_index < 2; ++ranges_index) \ > + elf_dynamic_do_##reloc ((map), scope, \ > + ranges[ranges_index].start, \ > + ranges[ranges_index].size, \ > + ranges[ranges_index].nrelative, \ > + ranges[ranges_index].lazy, \ > + skip_ifunc); \ > } while (0) > > # if ELF_MACHINE_NO_REL || ELF_MACHINE_NO_RELA > -- > 2.32.0 > LGTM. Reviewed-by: H.J. Lu <hjl.tools@gmail.com> Thanks.
diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h index ac4cc70dea..f619615e5c 100644 --- a/elf/dynamic-link.h +++ b/elf/dynamic-link.h @@ -65,12 +65,6 @@ elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[], #ifdef RESOLVE_MAP -# if defined RTLD_BOOTSTRAP || defined STATIC_PIE_BOOTSTRAP -# define ELF_DURING_STARTUP (1) -# else -# define ELF_DURING_STARTUP (0) -# endif - /* Get the definitions of `elf_dynamic_do_rel' and `elf_dynamic_do_rela'. These functions are almost identical, so we use cpp magic to avoid duplicating their code. It cannot be done in a more general function @@ -106,9 +100,8 @@ elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[], \ if (ranges[0].start + ranges[0].size == (start + size)) \ ranges[0].size -= size; \ - if (ELF_DURING_STARTUP \ - || (!(do_lazy) \ - && (ranges[0].start + ranges[0].size) == start)) \ + if (!(do_lazy) \ + && (ranges[0].start + ranges[0].size) == start) \ { \ /* Combine processing the sections. */ \ ranges[0].size += size; \ @@ -121,20 +114,13 @@ elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[], } \ } \ \ - if (ELF_DURING_STARTUP) \ - elf_dynamic_do_##reloc ((map), scope, ranges[0].start, ranges[0].size, \ - ranges[0].nrelative, 0, skip_ifunc); \ - else \ - { \ - int ranges_index; \ - for (ranges_index = 0; ranges_index < 2; ++ranges_index) \ - elf_dynamic_do_##reloc ((map), scope, \ - ranges[ranges_index].start, \ - ranges[ranges_index].size, \ - ranges[ranges_index].nrelative, \ - ranges[ranges_index].lazy, \ - skip_ifunc); \ - } \ + for (int ranges_index = 0; ranges_index < 2; ++ranges_index) \ + elf_dynamic_do_##reloc ((map), scope, \ + ranges[ranges_index].start, \ + ranges[ranges_index].size, \ + ranges[ranges_index].nrelative, \ + ranges[ranges_index].lazy, \ + skip_ifunc); \ } while (0) # if ELF_MACHINE_NO_REL || ELF_MACHINE_NO_RELA