summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2014-04-15 14:04:19 +0200
committerMark Wielaard <mjw@redhat.com>2014-04-24 13:18:33 +0200
commitefa72a02de8a3bbbc43c8de659697df5d425ea7e (patch)
treec118e04228d7094d15008c3db5e5d323a957e5dc
parent9380297e130e6ccc829c8d56d701fb539b27bb0f (diff)
downloadelfutils-efa72a02de8a3bbbc43c8de659697df5d425ea7e.tar.gz
dwarf_elf_begin: Add .gnu_debugaltlink to the sectiondata array
And use it if DWZ mode is enabled. Signed-off-by: Florian Weimer <fweimer@redhat.com>
-rw-r--r--libdw/ChangeLog8
-rw-r--r--libdw/dwarf_begin_elf.c33
-rw-r--r--libdw/libdwP.h1
3 files changed, 24 insertions, 18 deletions
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 1e2482d9..1d0274b6 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,11 @@
+2014-04-15 Florian Weimer <fweimer@redhat.com>
+
+ * libdwP.h (enum IDX_gnu_debugaltlink): New.
+ * dwarf_begin_elf.c (dwarf_scnnames): Increase string size and add
+ .gnu_debugaltlink.
+ (check_section): Obtain .gnu_debugaltlink section from the
+ setiondata array.
+
2014-04-11 Mark Wielaard <mjw@redhat.com>
* libdw.map (ELFUTILS_0.159): New. Add dwelf_elf_gnu_debuglink.
diff --git a/libdw/dwarf_begin_elf.c b/libdw/dwarf_begin_elf.c
index 34ea3734..5f69c61c 100644
--- a/libdw/dwarf_begin_elf.c
+++ b/libdw/dwarf_begin_elf.c
@@ -54,7 +54,7 @@
/* Section names. */
-static const char dwarf_scnnames[IDX_last][17] =
+static const char dwarf_scnnames[IDX_last][18] =
{
[IDX_debug_info] = ".debug_info",
[IDX_debug_types] = ".debug_types",
@@ -67,7 +67,8 @@ static const char dwarf_scnnames[IDX_last][17] =
[IDX_debug_str] = ".debug_str",
[IDX_debug_macinfo] = ".debug_macinfo",
[IDX_debug_macro] = ".debug_macro",
- [IDX_debug_ranges] = ".debug_ranges"
+ [IDX_debug_ranges] = ".debug_ranges",
+ [IDX_gnu_debugaltlink] = ".gnu_debugaltlink"
};
#define ndwarf_scnnames (sizeof (dwarf_scnnames) / sizeof (dwarf_scnnames[0]))
@@ -223,22 +224,6 @@ check_section (Dwarf *result, GElf_Ehdr *ehdr, Elf_Scn *scn, bool inscngrp)
return NULL;
}
-#ifdef ENABLE_DWZ
- /* For dwz multifile support, ignore if it looks wrong. */
- if (strcmp (scnname, ".gnu_debugaltlink") == 0)
- {
- Elf_Data *data = elf_getdata (scn, NULL);
- if (data != NULL && data->d_size != 0)
- {
- const char *alt_name = data->d_buf;
- const void *build_id = memchr (data->d_buf, '\0', data->d_size);
- const int id_len = data->d_size - (build_id - data->d_buf + 1);
- if (alt_name && build_id && id_len > 0)
- return open_debugaltlink (result, alt_name, build_id + 1, id_len);
- }
- }
-#endif /* ENABLE_DWZ */
-
/* Recognize the various sections. Most names start with .debug_. */
size_t cnt;
for (cnt = 0; cnt < ndwarf_scnnames; ++cnt)
@@ -334,6 +319,18 @@ check_section (Dwarf *result, GElf_Ehdr *ehdr, Elf_Scn *scn, bool inscngrp)
}
#endif
+#ifdef ENABLE_DWZ
+ Elf_Data *data = result->sectiondata[IDX_gnu_debugaltlink];
+ if (data != NULL && data->d_size != 0)
+ {
+ const char *alt_name = data->d_buf;
+ const void *build_id = memchr (data->d_buf, '\0', data->d_size);
+ const int id_len = data->d_size - (build_id - data->d_buf + 1);
+ if (alt_name && build_id && id_len > 0)
+ return open_debugaltlink (result, alt_name, build_id + 1, id_len);
+ }
+#endif /* ENABLE_DWZ */
+
return result;
}
diff --git a/libdw/libdwP.h b/libdw/libdwP.h
index 49392005..a6884561 100644
--- a/libdw/libdwP.h
+++ b/libdw/libdwP.h
@@ -74,6 +74,7 @@ enum
IDX_debug_macinfo,
IDX_debug_macro,
IDX_debug_ranges,
+ IDX_gnu_debugaltlink,
IDX_last
};