[PATCH v4 2/2] x86: Update _dl_tlsdesc_dynamic to preserve caller-saved registers
H.J. Lu
hjl.tools@gmail.com
Fri Feb 16 12:20:30 GMT 2024
On Fri, Feb 16, 2024 at 4:18 AM Florian Weimer <fweimer@redhat.com> wrote:
>
> * H. J. Lu:
>
> > On Thu, Feb 15, 2024 at 10:23 PM Florian Weimer <fweimer@redhat.com> wrote:
> >>
> >> * Adhemerval Zanella Netto:
> >>
> >> >> diff --git a/elf/malloc-for-test.map b/elf/malloc-for-test.map
> >> >> new file mode 100644
> >> >> index 0000000000..8437cf4346
> >> >> --- /dev/null
> >> >> +++ b/elf/malloc-for-test.map
> >> >> @@ -0,0 +1,6 @@
> >> >> +GLIBC_2.0 {
> >> >
> >> > You need to use the correct version to override the malloc:
> >> >
> >> > $ gdb --args tst-gnu2-tls2 --direct
> >> > [...]
> >> > (gdb) b apply_tls
> >> > (gdb) r
> >> > Thread 2 "tst-gnu2-tls2" hit Breakpoint 1, apply_tls (p=0x7ffff7bfee80) at tst-gnu2-tls2mod1.c:25
> >> > 25 {
> >> > (gdb) b malloc
> >> > Breakpoint 2 at 0x7ffff7ca8ad0: malloc. (3 locations)
> >> > (gdb) c
> >> > Continuing.
> >>
> >> Why do we need to set a symbol version here? I think this can be
> >> removed.
> >
> > malloc-for-test.so provides a fake malloc to clobber caller-save
> > registers. Since malloc in ld.so has a symbol version,
> >
> > struct r_found_version version;
> > version.name = symbol_version_string (libc, GLIBC_2_0);
> > version.hidden = 0;
> > version.hash = _dl_elf_hash (version.name);
> > version.filename = NULL;
> >
> > void *new_calloc = lookup_malloc_symbol (main_map, "calloc", &version);
> > void *new_free = lookup_malloc_symbol (main_map, "free", &version);
> > void *new_malloc = lookup_malloc_symbol (main_map, "malloc", &version);
> > void *new_realloc = lookup_malloc_symbol (main_map, "realloc", &version);
> >
> > malloc in malloc-for-test.so must have the same version. Otherwise,
> > it won't be used in the test.
>
> I thought that unversioned symbols interpose all versioned symbols. Has
> this changed in the dynamic linker?
Only for this case.
> Thanks,
> Florian
>
--
H.J.
More information about the Libc-alpha
mailing list