Message ID | 20180529120848.GA13734@intel.com |
---|---|
State | New |
Headers | show |
Series | static-PIE: Update DT_DEBUG for debugger [BZ #23206] | expand |
On 05/29/2018 08:08 AM, H.J. Lu wrote: > This is needed to support debugging dlopened shared libraries in static > PIE. > > OK for master? > This looks good. We always need to setup r_debug properly and this looks like the right solution to me. IIUC we set RT_CONSISTENT at this point because we are consistent (not doing anything with the link map the debugger needs to be aware of). Reviewed-by: Carlos O'Donell <carlos@redhat.com> > H.J. > [BZ #23206] > * elf/dl-reloc-static-pie.c (_dl_relocate_static_pie): Initialize > _r_debug and update DT_DEBUG for debugger. > --- > elf/dl-reloc-static-pie.c | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/elf/dl-reloc-static-pie.c b/elf/dl-reloc-static-pie.c > index bd2d516e5d..ab1ce0eacc 100644 > --- a/elf/dl-reloc-static-pie.c > +++ b/elf/dl-reloc-static-pie.c > @@ -48,5 +48,21 @@ _dl_relocate_static_pie (void) > data access using the global offset table. */ > ELF_DYNAMIC_RELOCATE (main_map, 0, 0, 0); > main_map->l_relocated = 1; > + > + /* Initialize _r_debug. */ > + struct r_debug *r = _dl_debug_initialize (0, LM_ID_BASE); > + r->r_state = RT_CONSISTENT; > + > + /* Set up debugging before the debugger is notified for the first > + time. */ > +# ifdef ELF_MACHINE_DEBUG_SETUP > + /* Some machines (e.g. MIPS) don't use DT_DEBUG in this way. */ > + ELF_MACHINE_DEBUG_SETUP (main_map, r); > +# else > + if (main_map->l_info[DT_DEBUG] != NULL) > + /* There is a DT_DEBUG entry in the dynamic section. Fill it in > + with the run-time address of the r_debug structure */ > + main_map->l_info[DT_DEBUG]->d_un.d_ptr = (ElfW(Addr)) r; > +# endif > } > #endif >
diff --git a/elf/dl-reloc-static-pie.c b/elf/dl-reloc-static-pie.c index bd2d516e5d..ab1ce0eacc 100644 --- a/elf/dl-reloc-static-pie.c +++ b/elf/dl-reloc-static-pie.c @@ -48,5 +48,21 @@ _dl_relocate_static_pie (void) data access using the global offset table. */ ELF_DYNAMIC_RELOCATE (main_map, 0, 0, 0); main_map->l_relocated = 1; + + /* Initialize _r_debug. */ + struct r_debug *r = _dl_debug_initialize (0, LM_ID_BASE); + r->r_state = RT_CONSISTENT; + + /* Set up debugging before the debugger is notified for the first + time. */ +# ifdef ELF_MACHINE_DEBUG_SETUP + /* Some machines (e.g. MIPS) don't use DT_DEBUG in this way. */ + ELF_MACHINE_DEBUG_SETUP (main_map, r); +# else + if (main_map->l_info[DT_DEBUG] != NULL) + /* There is a DT_DEBUG entry in the dynamic section. Fill it in + with the run-time address of the r_debug structure */ + main_map->l_info[DT_DEBUG]->d_un.d_ptr = (ElfW(Addr)) r; +# endif } #endif