I agree the existing hard-coded "/usr/lib/debug" should be removed.

Yeah, it's certainly more complicated to properly process the split debug
information.  I think that a proper hook for accessing debug information
might be worth it.  It may be possible that the debug information is in dbx
(or stabs?).

On Sun, Feb 5, 2017 at 12:02 PM, Bert Wesarg <[email protected]>
wrote:

> Dave,
>
> On Sat, Feb 4, 2017 at 9:15 PM, Dave Watson <[email protected]> wrote:
> > Currently we only look at the current image to resolve function names,
> > which requires debug info.  Often the debug info is split to a different
> > file.  os-linux.c does look in some distro's path in /usr/lib/debug%s,
> > this diff will also follow the commonly used .gnu_debuglink section.
> > ---
> >  src/elfxx.c | 16 ++++++++++++++++
> >  1 file changed, 16 insertions(+)
> >
> > diff --git a/src/elfxx.c b/src/elfxx.c
> > index 25bd5a2..7b05f3f 100644
> > --- a/src/elfxx.c
> > +++ b/src/elfxx.c
> > @@ -312,11 +312,27 @@ elf_w (get_proc_name) (unw_addr_space_t as, pid_t
> pid, unw_word_t ip,
> >    unsigned long segbase, mapoff;
> >    struct elf_image ei;
> >    int ret;
> > +  Elf_W (Shdr) *shdr;
> >
> >    ret = tdep_get_elf_image (&ei, pid, ip, &segbase, &mapoff, NULL, 0);
> >    if (ret < 0)
> >      return ret;
> >
> > +  shdr = elf_w (find_section) (&ei, ".gnu_debuglink");
> > +  if (shdr) {
> > +    char debug_path[PATH_MAX];
> > +    char *link = ((uint8_t *) ei.image) + shdr->sh_offset;
> > +    size_t link_len = shdr->sh_size;
> > +
> > +    strncpy(debug_path, link, link_len);
>
> Unfurtnatly, interpreting .gnu_debuglink is not that simple. I refer here
> to
>
> https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html
>
> At least it is important, the the .gnu_debuglink should not contain
> any path components at all. Thus using .gnu_debuglink verbatime wont
> result in any sane path.
>
> Also I think the code in os-linux.c should loose its current
> /usr/lib/debug code.
>
> Bert
>
> > +    Debug(1, "Found debuglink section, following %s len %i\n",
> debug_path, link_len);
> > +    munmap (ei.image, ei.size);
> > +
> > +    ret = elf_map_image(&ei, debug_path);
> > +    if (ret < 0)
> > +      return ret;
> > +  }
> > +
> >    ret = elf_w (get_proc_name_in_image) (as, &ei, segbase, mapoff, ip,
> buf, buf_len, offp);
> >
> >    munmap (ei.image, ei.size);
> > --
> > 2.8.0-rc2
> >
>



-- 
Saleem Abdulrasool
compnerd (at) compnerd (dot) org
_______________________________________________
Libunwind-devel mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/libunwind-devel

Reply via email to