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

H.J. Lu hjl.tools@gmail.com
Wed Aug 18 00:21:29 GMT 2021


On Tue, Aug 17, 2021 at 1:26 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Tue, Aug 17, 2021 at 10:57 AM Daniel Walker <danielwa@cisco.com> 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 <conhuang@cisco.com>:
> > >
> > > 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)

-- 
H.J.


More information about the Gdb mailing list