[PATCH] mips: fix elf/tst-dlmopen4

H.J. Lu hjl.tools@gmail.com
Fri Jan 28 21:20:45 GMT 2022


On Fri, Jan 28, 2022 at 12:49 PM Carlos O'Donell <carlos@redhat.com> wrote:
>
> On 1/28/22 15:41, H.J. Lu wrote:
> > On Fri, Jan 28, 2022 at 11:04 AM Carlos O'Donell via Libc-alpha
> > <libc-alpha@sourceware.org> wrote:
> >>
> >> On 1/28/22 13:54, Xi Ruoyao via Libc-alpha wrote:
> >>> MIPS uses DT_MIPS_RLD_MAP and DT_MIPS_RLD_MAP_REL instead of DT_DEBUG,
> >>> to provide access to r_debug.
> >>
> >> This looks correct to me. OK for glibc 2.35.
> >>
> >> I'm going to push this today if there are no other objections.
> >>
> >> Reviewed-by: Carlos O'Donell <carlos@redhat.com>
> >>
> >>> ---
> >>>  elf/tst-dlmopen4.c | 29 +++++++++++++++++++----------
> >>>  1 file changed, 19 insertions(+), 10 deletions(-)
> >>>
> >>> diff --git a/elf/tst-dlmopen4.c b/elf/tst-dlmopen4.c
> >>> index d8bcf7e9d5..de67a30a4b 100644
> >>> --- a/elf/tst-dlmopen4.c
> >>> +++ b/elf/tst-dlmopen4.c
> >>> @@ -25,17 +25,26 @@
> >>>  #include <support/check.h>
> >>>  #include <support/test-driver.h>
> >>>
> >>> -#ifndef ELF_MACHINE_GET_R_DEBUG
> >>> -# define ELF_MACHINE_GET_R_DEBUG(d) \
> >>> -    (__extension__ ({                                                \
> >>> -      struct r_debug_extended *debug;                                \
> >>> -      if ((d)->d_tag == DT_DEBUG)                            \
> >>> -     debug = (struct r_debug_extended *) (d)->d_un.d_ptr;    \
> >>> -      else                                                   \
> >>> -     debug = NULL;                                           \
> >>> -      debug; }))
> >>> +static struct r_debug_extended *
> >>> +elf_get_r_debug (ElfW(Dyn) *d)
> >>> +{
> >>> +#ifdef __mips__
> >
> > Shouldn't MIPS simply define a proper ELF_MACHINE_GET_R_DEBUG?
> > It can be done with a header file.
>
> The only use of ELF_MACHINE_GET_R_DEBUG is in the test, and the static function
> is easier to read, edit, and debug, all of which is better for a test?

I don't think __mips__ should be in generic code.  There
another place where we need to handle _r_debug differences.
A single header file can cover both.

>
> >>> +  if (d->d_tag == DT_MIPS_RLD_MAP_REL)
> >>> +    {
> >>> +      char *ptr = (char *) d;
> >>> +      ptr += d->d_un.d_val;
> >>> +      return *(struct r_debug_extended **) ptr;
> >>> +    }
> >>> +  else if (d->d_tag == DT_MIPS_RLD_MAP)
> >>> +    return *(struct r_debug_extended **) d->d_un.d_ptr;
> >>
> >> OK. Matches the logic in sysdeps/mips/dl-debug.h
> >>
> >>> +#else
> >>> +  if (d->d_tag == DT_DEBUG)
> >>> +    return (struct r_debug_extended *) d->d_un.d_ptr;
> >>
> >> OK.
> >>
> >>>  #endif
> >>>
> >>> +  return NULL;
> >>
> >> OK.
> >>
> >>> +}
> >>> +
> >>>  static int
> >>>  do_test (void)
> >>>  {
> >>> @@ -44,7 +53,7 @@ do_test (void)
> >>>
> >>>    for (d = _DYNAMIC; d->d_tag != DT_NULL; ++d)
> >>>      {
> >>> -      debug = ELF_MACHINE_GET_R_DEBUG (d);
> >>> +      debug = elf_get_r_debug (d);
> >>
> >> OK.
> >>
> >>>        if (debug != NULL)
> >>>       break;
> >>>      }
> >>
> >>
> >> --
> >> Cheers,
> >> Carlos.
> >>
> >
> >
>
>
> --
> Cheers,
> Carlos.
>


-- 
H.J.


More information about the Libc-alpha mailing list