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);
+    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


_______________________________________________
Libunwind-devel mailing list
Libunwind-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/libunwind-devel

Reply via email to