diff options
author | Florian Weimer <fweimer@redhat.com> | 2014-04-15 14:04:19 +0200 |
---|---|---|
committer | Mark Wielaard <mjw@redhat.com> | 2014-04-24 13:18:33 +0200 |
commit | efa72a02de8a3bbbc43c8de659697df5d425ea7e (patch) | |
tree | c118e04228d7094d15008c3db5e5d323a957e5dc | |
parent | 9380297e130e6ccc829c8d56d701fb539b27bb0f (diff) | |
download | elfutils-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/ChangeLog | 8 | ||||
-rw-r--r-- | libdw/dwarf_begin_elf.c | 33 | ||||
-rw-r--r-- | libdw/libdwP.h | 1 |
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 }; |