Add an altlink field to struct dwarf_data, and initialize it with the pointer
to the struct dwarf_data for the .gnu_debugaltlink.

2018-11-11  Tom de Vries  <tdevr...@suse.de>

        * dwarf.c (struct dwarf_data): Add altlink field.
        (backtrace_dwarf_add): Add and handle fileline_entry and
        fileline_altlink parameters.
        * elf.c (elf_add): Add and handle fileline_entry parameter.  Add args to
        backtrace_dwarf_add call.
        (phdr_callback, backtrace_initialize): Add arguments to elf_add calls.
        * internal.h (backtrace_dwarf_add): Add fileline_entry and
        fileline_altlink parameters.
        * pecoff.c (coff_add): Add args to backtrace_dwarf_add call.
        * xcoff.c (xcoff_add): Same.
---
 libbacktrace/dwarf.c    | 13 ++++++++++---
 libbacktrace/elf.c      | 24 +++++++++++++++---------
 libbacktrace/internal.h |  4 +++-
 libbacktrace/pecoff.c   |  3 ++-
 libbacktrace/xcoff.c    |  3 ++-
 5 files changed, 32 insertions(+), 15 deletions(-)

diff --git a/libbacktrace/dwarf.c b/libbacktrace/dwarf.c
index 0f8f70881f8..b571c9fbb06 100644
--- a/libbacktrace/dwarf.c
+++ b/libbacktrace/dwarf.c
@@ -343,6 +343,8 @@ struct dwarf_data
 {
   /* The data for the next file we know about.  */
   struct dwarf_data *next;
+  /* The data for .gnu_debugaltlink.  */
+  struct dwarf_data *altlink;
   /* The base address for this file.  */
   uintptr_t base_address;
   /* A sorted list of address ranges.  */
@@ -2968,7 +2970,7 @@ build_dwarf_data (struct backtrace_state *state,
                  size_t dwarf_str_size,
                  int is_bigendian,
                  backtrace_error_callback error_callback,
-                 void *data)
+                 void *data, struct dwarf_data *altlink)
 {
   struct unit_addrs_vector addrs_vec;
   struct unit_addrs *addrs;
@@ -2995,6 +2997,7 @@ build_dwarf_data (struct backtrace_state *state,
     return NULL;
 
   fdata->next = NULL;
+  fdata->altlink = altlink;
   fdata->base_address = base_address;
   fdata->addrs = addrs;
   fdata->addrs_count = addrs_count;
@@ -3031,7 +3034,8 @@ backtrace_dwarf_add (struct backtrace_state *state,
                     size_t dwarf_str_size,
                     int is_bigendian,
                     backtrace_error_callback error_callback,
-                    void *data, fileline *fileline_fn)
+                    void *data, fileline *fileline_fn, void **fileline_entry,
+                    void *fileline_altlink)
 {
   struct dwarf_data *fdata;
 
@@ -3039,10 +3043,13 @@ backtrace_dwarf_add (struct backtrace_state *state,
                            dwarf_line, dwarf_line_size, dwarf_abbrev,
                            dwarf_abbrev_size, dwarf_ranges, dwarf_ranges_size,
                            dwarf_str, dwarf_str_size, is_bigendian,
-                           error_callback, data);
+                           error_callback, data, fileline_altlink);
   if (fdata == NULL)
     return 0;
 
+  if (fileline_entry != NULL)
+    *fileline_entry = fdata;
+
   if (!state->threaded)
     {
       struct dwarf_data **pp;
diff --git a/libbacktrace/elf.c b/libbacktrace/elf.c
index f3bc2119c07..aeb248ec5e3 100644
--- a/libbacktrace/elf.c
+++ b/libbacktrace/elf.c
@@ -2638,8 +2638,8 @@ static int
 elf_add (struct backtrace_state *state, const char *filename, int descriptor,
         uintptr_t base_address, backtrace_error_callback error_callback,
         void *data, fileline *fileline_fn, int *found_sym, int *found_dwarf,
-        int exe, int debuginfo, const char *with_buildid_data,
-        uint32_t with_buildid_size)
+        void **fileline_entry, int exe, int debuginfo,
+        const char *with_buildid_data, uint32_t with_buildid_size)
 {
   struct backtrace_view ehdr_view;
   b_elf_ehdr ehdr;
@@ -3037,7 +3037,8 @@ elf_add (struct backtrace_state *state, const char 
*filename, int descriptor,
            backtrace_release_view (state, &debugaltlink_view, error_callback,
                                    data);
          ret = elf_add (state, NULL, d, base_address, error_callback, data,
-                        fileline_fn, found_sym, found_dwarf, 0, 1, NULL, 0);
+                        fileline_fn, found_sym, found_dwarf, NULL, 0, 1, NULL,
+                        0);
          if (ret < 0)
            backtrace_close (d, error_callback, data);
          else
@@ -3075,7 +3076,8 @@ elf_add (struct backtrace_state *state, const char 
*filename, int descriptor,
            backtrace_release_view (state, &debugaltlink_view, error_callback,
                                    data);
          ret = elf_add (state, NULL, d, base_address, error_callback, data,
-                        fileline_fn, found_sym, found_dwarf, 0, 1, NULL, 0);
+                        fileline_fn, found_sym, found_dwarf, NULL, 0, 1, NULL,
+                        0);
          if (ret < 0)
            backtrace_close (d, error_callback, data);
          else
@@ -3090,6 +3092,7 @@ elf_add (struct backtrace_state *state, const char 
*filename, int descriptor,
       debuglink_view_valid = 0;
     }
 
+  void *fileline_altlink = NULL;
   if (debugaltlink_name != NULL)
     {
       int d;
@@ -3101,8 +3104,9 @@ elf_add (struct backtrace_state *state, const char 
*filename, int descriptor,
          int ret;
 
          ret = elf_add (state, filename, d, base_address, error_callback, data,
-                        fileline_fn, found_sym, found_dwarf, 0, 1,
-                        debugaltlink_buildid_data, debugaltlink_buildid_size);
+                        fileline_fn, found_sym, found_dwarf, &fileline_altlink,
+                        0, 1, debugaltlink_buildid_data,
+                        debugaltlink_buildid_size);
          backtrace_release_view (state, &debugaltlink_view, error_callback,
                                  data);
          debugaltlink_view_valid = 0;
@@ -3264,7 +3268,8 @@ elf_add (struct backtrace_state *state, const char 
*filename, int descriptor,
                            sections[DEBUG_STR].data,
                            sections[DEBUG_STR].size,
                            ehdr.e_ident[EI_DATA] == ELFDATA2MSB,
-                           error_callback, data, fileline_fn))
+                           error_callback, data, fileline_fn,
+                           fileline_entry, fileline_altlink))
     goto fail;
 
   *found_dwarf = 1;
@@ -3354,7 +3359,7 @@ phdr_callback (struct dl_phdr_info *info, size_t size 
ATTRIBUTE_UNUSED,
 
   if (elf_add (pd->state, filename, descriptor, info->dlpi_addr,
               pd->error_callback, pd->data, &elf_fileline_fn, pd->found_sym,
-              &found_dwarf, 0, 0, NULL, 0))
+              &found_dwarf, NULL, 0, 0, NULL, 0))
     {
       if (found_dwarf)
        {
@@ -3382,7 +3387,8 @@ backtrace_initialize (struct backtrace_state *state, 
const char *filename,
   struct phdr_data pd;
 
   ret = elf_add (state, filename, descriptor, 0, error_callback, data,
-                &elf_fileline_fn, &found_sym, &found_dwarf, 1, 0, NULL, 0);
+                &elf_fileline_fn, &found_sym, &found_dwarf, NULL, 1, 0, NULL,
+                0);
   if (!ret)
     return 0;
 
diff --git a/libbacktrace/internal.h b/libbacktrace/internal.h
index 548f9d70905..bcf5a31da68 100644
--- a/libbacktrace/internal.h
+++ b/libbacktrace/internal.h
@@ -302,7 +302,9 @@ extern int backtrace_dwarf_add (struct backtrace_state 
*state,
                                size_t dwarf_str_size,
                                int is_bigendian,
                                backtrace_error_callback error_callback,
-                               void *data, fileline *fileline_fn);
+                               void *data, fileline *fileline_fn,
+                               void **fileline_entry,
+                               void *fileline_altlink);
 
 /* A test-only hook for elf_uncompress_zdebug.  */
 
diff --git a/libbacktrace/pecoff.c b/libbacktrace/pecoff.c
index 85737d61d49..fbe481cbbb6 100644
--- a/libbacktrace/pecoff.c
+++ b/libbacktrace/pecoff.c
@@ -867,7 +867,8 @@ coff_add (struct backtrace_state *state, int descriptor,
                            sections[DEBUG_STR].data,
                            sections[DEBUG_STR].size,
                            0, /* FIXME */
-                           error_callback, data, fileline_fn))
+                           error_callback, data, fileline_fn,
+                           NULL, NULL))
     goto fail;
 
   *found_dwarf = 1;
diff --git a/libbacktrace/xcoff.c b/libbacktrace/xcoff.c
index 84d0340d744..dc8265c59a8 100644
--- a/libbacktrace/xcoff.c
+++ b/libbacktrace/xcoff.c
@@ -1315,7 +1315,8 @@ xcoff_add (struct backtrace_state *state, int descriptor, 
off_t offset,
                                dwsect[DWSECT_STR].data,
                                dwsect[DWSECT_STR].size,
                                1, /* big endian */
-                               error_callback, data, fileline_fn))
+                               error_callback, data, fileline_fn,
+                               NULL, NULL))
        goto fail;
     }
 
-- 
2.16.4

Reply via email to