Re: [PATCH v2 2/2] Extend struct r_debug to support multiple namespaces

"H.J. Lu via Libc-alpha" <[email protected]>
Newsgroups gmane.comp.lib.glibc.alpha,gmane.comp.gdb.devel
Message-ID <CAMe9rOruVp9mvemyiOtQvYZD5TdEkwpNoYzBGww2hS0fy0eLgw@mail.gmail.com>
On Tue, Aug 17, 2021 at 5:21 PM H.J. Lu <[email protected]> wrote:
>
> On Tue, Aug 17, 2021 at 1:26 PM H.J. Lu <[email protected]> wrote:
> >
> > On Tue, Aug 17, 2021 at 10:57 AM Daniel Walker <[email protected]> wrote:
> > >
> > > On Mon, Aug 16, 2021 at 06:06:29PM -0700, H.J. Lu wrote:
> > > > Glibc does not provide an interface for debugger to access libraries
> > > > loaded in multiple namespaces via dlmopen.
> > > >
> > > > The current rtld-debugger interface is described in the file:
> > > >
> > > > elf/rtld-debugger-interface.txt
> > > >
> > > > under the "Standard debugger interface" heading.  This interface only
> > > > provides access to the first link-map (LM_ID_BASE).
> > > >
> > > > Based on the patch from Conan C Huang <[email protected]>:
> > > >
> > > > https://sourceware.org/pipermail/libc-alpha/2020-June/115448.html
> > > >
> > > > 1. Bump r_version to 2.  This triggers the GDB bug:
> > > >
> > > > https://sourceware.org/bugzilla/show_bug.cgi?id=28236
> > > >
> > > > 2. Add struct r_debug_extended to extend struct r_debug into a linked-list,
> > > > where each element correlates to an unique namespace.
> > > > 3. Add a hidden symbol, _r_debug_extended, for struct r_debug_extended.
> > > > 4. Provide the compatibility symbol, _r_debug, with size of struct r_debug,
> > > > as an alise of _r_debug_extended, for programs which reference _r_debug.
> > >
> > >
> > > I've attached the GDB patch which was created at Cisco to support our version of
> > > this type of feature which is similar to what you've created. You might be able
> > > to make some small modifications to make it work for you.
> > >
> > > Daniel
> >
> >
>
> It seems to work pretty well with some cleanup:
>
> https://gitlab.com/x86-binutils/binutils-gdb/-/commit/ea336450f484fc8c0aa512a60bc99f69309a46d8
>
> (gdb) set  stop-on-solib-events 1
> (gdb) r --direct
> Starting program:
> /export/build/gnu/tools-build/glibc-cet-gitlab/build-x86_64-linux/elf/tst-dlmopen4
> --direct
> Stopped due to shared library event (no libraries added or removed)
> (gdb) c
> Continuing.
> warning: Unable to find libthread_db matching inferior's thread
> library, thread debugging will not be available.
> Stopped due to shared library event:
>   Inferior loaded
> /export/build/gnu/tools-build/glibc-cet-gitlab/build-x86_64-linux/libc.so.6
> (gdb)
> Continuing.
> Stopped due to shared library event (no libraries added or removed)
> (gdb)
> Continuing.
> warning: .dynamic section for
> "/export/build/gnu/tools-build/glibc-cet-gitlab/build-x86_64-linux/elf/ld-linux-x86-64.so.2"
> is not at the expected address (wrong library or version mismatch?)
> warning: Unable to find libthread_db matching inferior's thread
> library, thread debugging will not be available.
> Stopped due to shared library event:
>   Inferior loaded
> /export/build/gnu/tools-build/glibc-cet-gitlab/build-x86_64-linux/elf/tst-dlmopen1mod.so
>     /export/build/gnu/tools-build/glibc-cet-gitlab/build-x86_64-linux/libc.so.6
>     /export/build/gnu/tools-build/glibc-cet-gitlab/build-x86_64-linux/elf/ld-linux-x86-64.so.2
> (gdb)
> Continuing.
> Stopped due to shared library event (no libraries added or removed)
> (gdb)
> Continuing.
> Stopped due to shared library event:
>   Inferior unloaded
> /export/build/gnu/tools-build/glibc-cet-gitlab/build-x86_64-linux/elf/tst-dlmopen1mod.so
>     /export/build/gnu/tools-build/glibc-cet-gitlab/build-x86_64-linux/libc.so.6
>     /export/build/gnu/tools-build/glibc-cet-gitlab/build-x86_64-linux/elf/ld-linux-x86-64.so.2
> (gdb)
> Continuing.
> [Inferior 1 (process 638559) exited normally]
> (gdb)
>
> (gdb) r --direct
> Starting program:
> /export/build/gnu/tools-build/glibc-cet-gitlab/build-x86_64-linux/elf/tst-dlmopen4
> --direct
> warning: Unable to find libthread_db matching inferior's thread
> library, thread debugging will not be available.
> warning: .dynamic section for
> "/export/build/gnu/tools-build/glibc-cet-gitlab/build-x86_64-linux/elf/ld-linux-x86-64.so.2"
> is not at the expected address (wrong library or version mismatch?)
> warning: Unable to find libthread_db matching inferior's thread
> library, thread debugging will not be available.
> [Inferior 1 (process 638480) exited normally]
> (gdb)
>
> It looks like l_ld of ld.so in the new namespace isn't set properly:
>
> (gdb) p debug->r_next->r_map
> $5 = (struct link_map *) 0x408360
> (gdb) p *debug->r_next->r_map
> $6 = {l_addr = 140737351757824,
>   l_name = 0x4082f0
> "/export/build/gnu/tools-build/glibc-cet-gitlab/build-x86_64-linux/elf/tst-dlmopen1mod.so",
> l_ld = 0x7ffff7dbee10, l_next = 0x408900,
>   l_prev = 0x0}
> (gdb) p *debug->r_next->r_map->l_next
> $7 = {l_addr = 140737349664768,
>   l_name = 0x4088a0
> "/export/build/gnu/tools-build/glibc-cet-gitlab/build-x86_64-linux/libc.so.6",
> l_ld = 0x7ffff7daabc0, l_next = 0x408e90, l_prev = 0x408360}
> (gdb) p *debug->r_next->r_map->l_next->l_next
> $8 = {l_addr = 0,
>   l_name = 0x408e20
> "/export/build/gnu/tools-build/glibc-cet-gitlab/build-x86_64-linux/elf/ld-linux-x86-64.so.2",
> l_ld = 0x0, l_next = 0x0, l_prev = 0x408900}
> (gdb)
>
>

Please try glibc users/hjl/pr15971/r_version branch:

https://gitlab.com/x86-glibc/glibc/-/tree/users/hjl/pr15971/r_version

and GDB users/hjl/pr11839/master branch:

https://gitlab.com/x86-binutils/binutils-gdb/-/tree/users/hjl/pr11839/master


-- 
H.J.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.