Add dwz support.
This commit is contained in:
parent
3152a53945
commit
ffa143207f
474
elfutils-0.154-dwz.patch
Normal file
474
elfutils-0.154-dwz.patch
Normal file
@ -0,0 +1,474 @@
|
||||
https://lists.fedorahosted.org/pipermail/elfutils-devel/2012-July/002418.html
|
||||
|
||||
From b1e42797293bcf34385d5cb0a18e8c773279241b Mon Sep 17 00:00:00 2001
|
||||
From: Mark Wielaard <mjw@redhat.com>
|
||||
Date: Fri, 22 Jun 2012 12:02:45 +0200
|
||||
Subject: [PATCH] libdw: Add support for DWZ multifile forms
|
||||
DW_FORM_GNU_ref_alt/strp_alt.
|
||||
|
||||
DWZ multifile forms http://www.dwarfstd.org/ShowIssue.php?issue=120604.1
|
||||
DW_FORM_GNU_ref_alt and DW_FORM_GNU_strp_alt reference an alternative
|
||||
debuginfo file. dwarf_begin and dwarf_begin_elf will try to use this
|
||||
automatically. There are no user visible changes to the libdw interface.
|
||||
|
||||
dwarf_formref_die, dwarf_formstring and dwarf_formudata can now return
|
||||
a Dwarf_Die which comes from a CU in the alternative Dwarf descriptor.
|
||||
|
||||
__libdw_read_offset was adjusted to take an alternative Dwarf descriptor
|
||||
into account.
|
||||
|
||||
Signed-off-by: Mark Wielaard <mjw@redhat.com>
|
||||
|
||||
diff --git a/libdw/dwarf.h b/libdw/dwarf.h
|
||||
index f41d296..81bc7fe 100644
|
||||
--- a/libdw/dwarf.h
|
||||
+++ b/libdw/dwarf.h
|
||||
@@ -299,7 +299,10 @@ enum
|
||||
DW_FORM_sec_offset = 0x17,
|
||||
DW_FORM_exprloc = 0x18,
|
||||
DW_FORM_flag_present = 0x19,
|
||||
- DW_FORM_ref_sig8 = 0x20
|
||||
+ DW_FORM_ref_sig8 = 0x20,
|
||||
+
|
||||
+ DW_FORM_GNU_ref_alt = 0x1f20, /* offset in alternate .debuginfo. */
|
||||
+ DW_FORM_GNU_strp_alt = 0x1f21 /* offset in alternate .debug_str. */
|
||||
};
|
||||
|
||||
|
||||
diff --git a/libdw/dwarf_begin.c b/libdw/dwarf_begin.c
|
||||
index 1f3fc3b..9f3050f 100644
|
||||
--- a/libdw/dwarf_begin.c
|
||||
+++ b/libdw/dwarf_begin.c
|
||||
@@ -98,3 +98,4 @@ dwarf_begin (fd, cmd)
|
||||
|
||||
return result;
|
||||
}
|
||||
+INTDEF(dwarf_begin)
|
||||
diff --git a/libdw/dwarf_begin_elf.c b/libdw/dwarf_begin_elf.c
|
||||
index 3e01800..fd95770 100644
|
||||
--- a/libdw/dwarf_begin_elf.c
|
||||
+++ b/libdw/dwarf_begin_elf.c
|
||||
@@ -31,12 +31,17 @@
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
+#include <assert.h>
|
||||
+#include <inttypes.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
+#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
+#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
+#include <fcntl.h>
|
||||
|
||||
#include "libdwP.h"
|
||||
|
||||
@@ -66,6 +71,110 @@ static const char dwarf_scnnames[IDX_last][17] =
|
||||
};
|
||||
#define ndwarf_scnnames (sizeof (dwarf_scnnames) / sizeof (dwarf_scnnames[0]))
|
||||
|
||||
+internal_function int
|
||||
+__check_build_id (Dwarf *dw, const uint8_t *build_id, const size_t id_len)
|
||||
+{
|
||||
+ if (dw == NULL)
|
||||
+ return -1;
|
||||
+
|
||||
+ Elf *elf = dw->elf;
|
||||
+ Elf_Scn *scn = elf_nextscn (elf, NULL);
|
||||
+ if (scn == NULL)
|
||||
+ return -1;
|
||||
+
|
||||
+ do
|
||||
+ {
|
||||
+ GElf_Shdr shdr_mem;
|
||||
+ GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
|
||||
+ if (likely (shdr != NULL) && shdr->sh_type == SHT_NOTE)
|
||||
+ {
|
||||
+ size_t pos = 0;
|
||||
+ GElf_Nhdr nhdr;
|
||||
+ size_t name_pos;
|
||||
+ size_t desc_pos;
|
||||
+ Elf_Data *data = elf_getdata (scn, NULL);
|
||||
+ while ((pos = gelf_getnote (data, pos, &nhdr, &name_pos,
|
||||
+ &desc_pos)) > 0)
|
||||
+ if (nhdr.n_type == NT_GNU_BUILD_ID
|
||||
+ && nhdr.n_namesz == sizeof "GNU"
|
||||
+ && ! memcmp (data->d_buf + name_pos, "GNU", sizeof "GNU"))
|
||||
+ return (nhdr.n_descsz == id_len
|
||||
+ && ! memcmp (data->d_buf + desc_pos,
|
||||
+ build_id, id_len)) ? 0 : 1;
|
||||
+ }
|
||||
+ }
|
||||
+ while ((scn = elf_nextscn (elf, scn)) != NULL);
|
||||
+
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+/* Try to open an debug alt link by name, checking build_id.
|
||||
+ Marks free_alt on success, return NULL on failure. */
|
||||
+static Dwarf *
|
||||
+try_debugaltlink (Dwarf *result, const char *try_name,
|
||||
+ const uint8_t *build_id, const size_t id_len)
|
||||
+{
|
||||
+ int fd = open (try_name, O_RDONLY);
|
||||
+ if (fd > 0)
|
||||
+ {
|
||||
+ result->alt_dwarf = INTUSE (dwarf_begin) (fd, DWARF_C_READ);
|
||||
+ if (result->alt_dwarf != NULL)
|
||||
+ {
|
||||
+ Elf *elf = result->alt_dwarf->elf;
|
||||
+ if (__check_build_id (result->alt_dwarf, build_id, id_len) == 0
|
||||
+ && elf_cntl (elf, ELF_C_FDREAD) == 0)
|
||||
+ {
|
||||
+ close (fd);
|
||||
+ result->free_alt = 1;
|
||||
+ return result;
|
||||
+ }
|
||||
+ INTUSE (dwarf_end) (result->alt_dwarf);
|
||||
+ }
|
||||
+ close (fd);
|
||||
+ }
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+/* For dwz multifile support, ignore if it looks wrong. */
|
||||
+static Dwarf *
|
||||
+open_debugaltlink (Dwarf *result, const char *alt_name,
|
||||
+ const uint8_t *build_id, const size_t id_len)
|
||||
+{
|
||||
+ /* First try the name itself, it is either an absolute path or
|
||||
+ a relative one. Sadly we don't know relative from where at
|
||||
+ this point. */
|
||||
+ if (try_debugaltlink (result, alt_name, build_id, id_len) != NULL)
|
||||
+ return result;
|
||||
+
|
||||
+ /* Lets try based on the build-id. This is somewhat distro specific,
|
||||
+ we are following the Fedora implementation described at
|
||||
+ https://fedoraproject.org/wiki/Releases/FeatureBuildId#Find_files_by_build_ID
|
||||
+ */
|
||||
+#define DEBUG_PREFIX "/usr/lib/debug/.build-id/"
|
||||
+#define PREFIX_LEN sizeof (DEBUG_PREFIX)
|
||||
+ char id_name[PREFIX_LEN + 1 + id_len * 2 + sizeof ".debug" - 1];
|
||||
+ strcpy (id_name, DEBUG_PREFIX);
|
||||
+ int n = snprintf (&id_name[PREFIX_LEN - 1],
|
||||
+ 4, "%02" PRIx8 "/", (uint8_t) build_id[0]);
|
||||
+ assert (n == 3);
|
||||
+ for (size_t i = 1; i < id_len; ++i)
|
||||
+ {
|
||||
+ n = snprintf (&id_name[PREFIX_LEN - 1 + 3 + (i - 1) * 2],
|
||||
+ 3, "%02" PRIx8, (uint8_t) build_id[i]);
|
||||
+ assert (n == 2);
|
||||
+ }
|
||||
+ strcpy (&id_name[PREFIX_LEN - 1 + 3 + (id_len - 1) * 2],
|
||||
+ ".debug");
|
||||
+
|
||||
+ if (try_debugaltlink (result, id_name, build_id, id_len))
|
||||
+ return result;
|
||||
+
|
||||
+ /* Everything failed, mark this Dwarf as not having an alternate,
|
||||
+ but don't fail the load. The user may want to set it by hand
|
||||
+ before usage. */
|
||||
+ result->alt_dwarf = NULL;
|
||||
+ return result;
|
||||
+}
|
||||
|
||||
static Dwarf *
|
||||
check_section (Dwarf *result, GElf_Ehdr *ehdr, Elf_Scn *scn, bool inscngrp)
|
||||
@@ -110,6 +219,20 @@ check_section (Dwarf *result, GElf_Ehdr *ehdr, Elf_Scn *scn, bool inscngrp)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+ /* 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);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
|
||||
/* Recognize the various sections. Most names start with .debug_. */
|
||||
size_t cnt;
|
||||
diff --git a/libdw/dwarf_end.c b/libdw/dwarf_end.c
|
||||
index b77988f..e65314a 100644
|
||||
--- a/libdw/dwarf_end.c
|
||||
+++ b/libdw/dwarf_end.c
|
||||
@@ -111,6 +111,10 @@ dwarf_end (dwarf)
|
||||
if (dwarf->free_elf)
|
||||
elf_end (dwarf->elf);
|
||||
|
||||
+ /* Free the alternative Dwarf descriptor if necessary. */
|
||||
+ if (dwarf->free_alt)
|
||||
+ INTUSE (dwarf_end) (dwarf->alt_dwarf);
|
||||
+
|
||||
/* Free the context descriptor. */
|
||||
free (dwarf);
|
||||
}
|
||||
diff --git a/libdw/dwarf_error.c b/libdw/dwarf_error.c
|
||||
index 89047dc..2292914 100644
|
||||
--- a/libdw/dwarf_error.c
|
||||
+++ b/libdw/dwarf_error.c
|
||||
@@ -91,6 +91,7 @@ static const char *errmsgs[] =
|
||||
[DWARF_E_INVALID_OFFSET] = N_("invalid offset"),
|
||||
[DWARF_E_NO_DEBUG_RANGES] = N_(".debug_ranges section missing"),
|
||||
[DWARF_E_INVALID_CFI] = N_("invalid CFI section"),
|
||||
+ [DWARF_E_NO_ALT_DEBUGLINK] = N_("no alternative debug link found"),
|
||||
};
|
||||
#define nerrmsgs (sizeof (errmsgs) / sizeof (errmsgs[0]))
|
||||
|
||||
diff --git a/libdw/dwarf_formref.c b/libdw/dwarf_formref.c
|
||||
index a2554e9..86da7ea 100644
|
||||
--- a/libdw/dwarf_formref.c
|
||||
+++ b/libdw/dwarf_formref.c
|
||||
@@ -72,6 +72,8 @@ __libdw_formref (attr, return_offset)
|
||||
|
||||
case DW_FORM_ref_addr:
|
||||
case DW_FORM_ref_sig8:
|
||||
+ case DW_FORM_GNU_ref_alt:
|
||||
+ /* These aren't handled by dwarf_formref, only by dwarf_formref_die. */
|
||||
__libdw_seterrno (DWARF_E_INVALID_REFERENCE);
|
||||
return -1;
|
||||
|
||||
diff --git a/libdw/dwarf_formref_die.c b/libdw/dwarf_formref_die.c
|
||||
index 342f6b9..f070127 100644
|
||||
--- a/libdw/dwarf_formref_die.c
|
||||
+++ b/libdw/dwarf_formref_die.c
|
||||
@@ -46,7 +46,7 @@ dwarf_formref_die (attr, result)
|
||||
struct Dwarf_CU *cu = attr->cu;
|
||||
|
||||
Dwarf_Off offset;
|
||||
- if (attr->form == DW_FORM_ref_addr)
|
||||
+ if (attr->form == DW_FORM_ref_addr || attr->form == DW_FORM_GNU_ref_alt)
|
||||
{
|
||||
/* This has an absolute offset. */
|
||||
|
||||
@@ -54,11 +54,20 @@ dwarf_formref_die (attr, result)
|
||||
? cu->address_size
|
||||
: cu->offset_size);
|
||||
|
||||
- if (__libdw_read_offset (cu->dbg, IDX_debug_info, attr->valp,
|
||||
+ Dwarf *dbg_ret = (attr->form == DW_FORM_GNU_ref_alt
|
||||
+ ? cu->dbg->alt_dwarf : cu->dbg);
|
||||
+
|
||||
+ if (dbg_ret == NULL)
|
||||
+ {
|
||||
+ __libdw_seterrno (DWARF_E_NO_ALT_DEBUGLINK);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ if (__libdw_read_offset (cu->dbg, dbg_ret, IDX_debug_info, attr->valp,
|
||||
ref_size, &offset, IDX_debug_info, 0))
|
||||
return NULL;
|
||||
|
||||
- return INTUSE(dwarf_offdie) (cu->dbg, offset, result);
|
||||
+ return INTUSE(dwarf_offdie) (dbg_ret, offset, result);
|
||||
}
|
||||
|
||||
Elf_Data *data;
|
||||
diff --git a/libdw/dwarf_formstring.c b/libdw/dwarf_formstring.c
|
||||
index fe2183a..c66454e 100644
|
||||
--- a/libdw/dwarf_formstring.c
|
||||
+++ b/libdw/dwarf_formstring.c
|
||||
@@ -49,8 +49,17 @@ dwarf_formstring (attrp)
|
||||
return (const char *) attrp->valp;
|
||||
|
||||
Dwarf *dbg = attrp->cu->dbg;
|
||||
+ Dwarf *dbg_ret = attrp->form == DW_FORM_GNU_strp_alt ? dbg->alt_dwarf : dbg;
|
||||
|
||||
- if (unlikely (attrp->form != DW_FORM_strp)
|
||||
+ if (unlikely (dbg_ret == NULL))
|
||||
+ {
|
||||
+ __libdw_seterrno (DWARF_E_NO_ALT_DEBUGLINK);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+ if (unlikely (attrp->form != DW_FORM_strp
|
||||
+ && attrp->form != DW_FORM_GNU_strp_alt)
|
||||
|| dbg->sectiondata[IDX_debug_str] == NULL)
|
||||
{
|
||||
__libdw_seterrno (DWARF_E_NO_STRING);
|
||||
@@ -58,10 +67,10 @@ dwarf_formstring (attrp)
|
||||
}
|
||||
|
||||
uint64_t off;
|
||||
- if (__libdw_read_offset (dbg, cu_sec_idx (attrp->cu), attrp->valp,
|
||||
+ if (__libdw_read_offset (dbg, dbg_ret, cu_sec_idx (attrp->cu), attrp->valp,
|
||||
attrp->cu->offset_size, &off, IDX_debug_str, 1))
|
||||
return NULL;
|
||||
|
||||
- return (const char *) dbg->sectiondata[IDX_debug_str]->d_buf + off;
|
||||
+ return (const char *) dbg_ret->sectiondata[IDX_debug_str]->d_buf + off;
|
||||
}
|
||||
INTDEF(dwarf_formstring)
|
||||
diff --git a/libdw/dwarf_formudata.c b/libdw/dwarf_formudata.c
|
||||
index f08e0d8..41b09e1 100644
|
||||
--- a/libdw/dwarf_formudata.c
|
||||
+++ b/libdw/dwarf_formudata.c
|
||||
@@ -52,7 +52,8 @@ __libdw_formptr (Dwarf_Attribute *attr, int sec_index,
|
||||
Dwarf_Word offset;
|
||||
if (attr->form == DW_FORM_sec_offset)
|
||||
{
|
||||
- if (__libdw_read_offset (attr->cu->dbg, cu_sec_idx (attr->cu), attr->valp,
|
||||
+ if (__libdw_read_offset (attr->cu->dbg, attr->cu->dbg,
|
||||
+ cu_sec_idx (attr->cu), attr->valp,
|
||||
attr->cu->offset_size, &offset, sec_index, 0))
|
||||
return NULL;
|
||||
}
|
||||
@@ -63,7 +64,8 @@ __libdw_formptr (Dwarf_Attribute *attr, int sec_index,
|
||||
{
|
||||
case DW_FORM_data4:
|
||||
case DW_FORM_data8:
|
||||
- if (__libdw_read_offset (attr->cu->dbg, cu_sec_idx (attr->cu),
|
||||
+ if (__libdw_read_offset (attr->cu->dbg, attr->cu->dbg,
|
||||
+ cu_sec_idx (attr->cu),
|
||||
attr->valp,
|
||||
attr->form == DW_FORM_data4 ? 4 : 8,
|
||||
&offset, sec_index, 0))
|
||||
diff --git a/libdw/dwarf_getpubnames.c b/libdw/dwarf_getpubnames.c
|
||||
index 4ea3889..12728a3 100644
|
||||
--- a/libdw/dwarf_getpubnames.c
|
||||
+++ b/libdw/dwarf_getpubnames.c
|
||||
@@ -102,7 +102,8 @@ get_offsets (Dwarf *dbg)
|
||||
}
|
||||
|
||||
/* Get the CU offset. */
|
||||
- if (__libdw_read_offset (dbg, IDX_debug_pubnames, readp + 2, len_bytes,
|
||||
+ if (__libdw_read_offset (dbg, dbg, IDX_debug_pubnames,
|
||||
+ readp + 2, len_bytes,
|
||||
&mem[cnt].cu_offset, IDX_debug_info, 3))
|
||||
/* Error has been already set in reader. */
|
||||
goto err_return;
|
||||
diff --git a/libdw/libdwP.h b/libdw/libdwP.h
|
||||
index 77e1b31..da82e5d 100644
|
||||
--- a/libdw/libdwP.h
|
||||
+++ b/libdw/libdwP.h
|
||||
@@ -116,6 +116,7 @@ enum
|
||||
DWARF_E_INVALID_OFFSET,
|
||||
DWARF_E_NO_DEBUG_RANGES,
|
||||
DWARF_E_INVALID_CFI,
|
||||
+ DWARF_E_NO_ALT_DEBUGLINK
|
||||
};
|
||||
|
||||
|
||||
@@ -127,6 +128,9 @@ struct Dwarf
|
||||
/* The underlying ELF file. */
|
||||
Elf *elf;
|
||||
|
||||
+ /* dwz alternate DWARF file. */
|
||||
+ Dwarf *alt_dwarf;
|
||||
+
|
||||
/* The section data. */
|
||||
Elf_Data *sectiondata[IDX_last];
|
||||
|
||||
@@ -141,6 +145,9 @@ struct Dwarf
|
||||
/* If true, we allocated the ELF descriptor ourselves. */
|
||||
bool free_elf;
|
||||
|
||||
+ /* If true, we allocated the Dwarf descriptor for alt_dwarf ourselves. */
|
||||
+ bool free_alt;
|
||||
+
|
||||
/* Information for traversing the .debug_pubnames section. This is
|
||||
an array and separately allocated with malloc. */
|
||||
struct pubnames_s
|
||||
@@ -580,13 +587,13 @@ __libdw_read_offset_inc (Dwarf *dbg,
|
||||
}
|
||||
|
||||
static inline int
|
||||
-__libdw_read_offset (Dwarf *dbg,
|
||||
+__libdw_read_offset (Dwarf *dbg, Dwarf *dbg_ret,
|
||||
int sec_index, const unsigned char *addr,
|
||||
int width, Dwarf_Off *ret, int sec_ret,
|
||||
size_t size)
|
||||
{
|
||||
READ_AND_RELOCATE (__libdw_relocate_offset, (*ret));
|
||||
- return __libdw_offset_in_section (dbg, sec_ret, *ret, size);
|
||||
+ return __libdw_offset_in_section (dbg_ret, sec_ret, *ret, size);
|
||||
}
|
||||
|
||||
static inline size_t
|
||||
@@ -617,12 +624,19 @@ unsigned char * __libdw_formptr (Dwarf_Attribute *attr, int sec_index,
|
||||
Dwarf_Off *offsetp)
|
||||
internal_function;
|
||||
|
||||
+/* Checks that the build_id of the underlying Elf matches the expected.
|
||||
+ Returns zero on match, -1 on error or no build_id found or 1 when
|
||||
+ build_id doesn't match. */
|
||||
+int __check_build_id (Dwarf *dw, const uint8_t *build_id, const size_t id_len)
|
||||
+ internal_function;
|
||||
+
|
||||
|
||||
|
||||
/* Aliases to avoid PLTs. */
|
||||
INTDECL (dwarf_aggregate_size)
|
||||
INTDECL (dwarf_attr)
|
||||
INTDECL (dwarf_attr_integrate)
|
||||
+INTDECL (dwarf_begin)
|
||||
INTDECL (dwarf_begin_elf)
|
||||
INTDECL (dwarf_child)
|
||||
INTDECL (dwarf_dieoffset)
|
||||
diff --git a/libdw/libdw_form.c b/libdw/libdw_form.c
|
||||
index 2ff8868..c476a6e 100644
|
||||
--- a/libdw/libdw_form.c
|
||||
+++ b/libdw/libdw_form.c
|
||||
@@ -58,6 +58,8 @@ __libdw_form_val_len (Dwarf *dbg, struct Dwarf_CU *cu, unsigned int form,
|
||||
|
||||
case DW_FORM_strp:
|
||||
case DW_FORM_sec_offset:
|
||||
+ case DW_FORM_GNU_ref_alt:
|
||||
+ case DW_FORM_GNU_strp_alt:
|
||||
result = cu->offset_size;
|
||||
break;
|
||||
|
||||
diff --git a/src/readelf.c b/src/readelf.c
|
||||
index 3a27f8f..644e0f7 100644
|
||||
--- a/src/readelf.c
|
||||
+++ b/src/readelf.c
|
||||
@@ -3651,6 +3651,20 @@ dwarf_form_string (unsigned int form)
|
||||
|
||||
if (likely (form < nknown_forms))
|
||||
result = known_forms[form];
|
||||
+ else
|
||||
+ {
|
||||
+ /* GNU extensions use vendor numbers. */
|
||||
+ switch (form)
|
||||
+ {
|
||||
+ case DW_FORM_GNU_ref_alt:
|
||||
+ result = "GNU_ref_alt";
|
||||
+ break;
|
||||
+
|
||||
+ case DW_FORM_GNU_strp_alt:
|
||||
+ result = "GNU_strp_alt";
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
if (unlikely (result == NULL))
|
||||
{
|
||||
@@ -5593,6 +5607,7 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
|
||||
case DW_FORM_indirect:
|
||||
case DW_FORM_strp:
|
||||
case DW_FORM_string:
|
||||
+ case DW_FORM_GNU_strp_alt:
|
||||
if (cbargs->silent)
|
||||
break;
|
||||
const char *str = dwarf_formstring (attrp);
|
||||
@@ -5608,7 +5623,8 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
|
||||
case DW_FORM_ref8:
|
||||
case DW_FORM_ref4:
|
||||
case DW_FORM_ref2:
|
||||
- case DW_FORM_ref1:;
|
||||
+ case DW_FORM_ref1:
|
||||
+ case DW_FORM_GNU_ref_alt:
|
||||
if (cbargs->silent)
|
||||
break;
|
||||
Dwarf_Die ref;
|
@ -1,7 +1,7 @@
|
||||
Name: elfutils
|
||||
Summary: A collection of utilities and DSOs to handle compiled objects
|
||||
Version: 0.154
|
||||
%global baserelease 2
|
||||
%global baserelease 3
|
||||
URL: https://fedorahosted.org/elfutils/
|
||||
%global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/
|
||||
License: GPLv3+ and (GPLv2+ or LGPLv3+)
|
||||
@ -47,6 +47,7 @@ Patch1: %{?source_url}elfutils-robustify.patch
|
||||
Patch2: %{?source_url}elfutils-portability.patch
|
||||
Patch3: elfutils-0.154-binutils-pr-ld-13621.patch
|
||||
Patch4: elfutils-0.154-xlatetom-835877.patch
|
||||
Patch5: elfutils-0.154-dwz.patch
|
||||
|
||||
%if !%{compat}
|
||||
Release: %{baserelease}%{?dist}
|
||||
@ -213,6 +214,7 @@ sed -i.scanf-m -e 's/%m/%a/g' src/addr2line.c tests/line2addr.c
|
||||
|
||||
%patch3 -p1 -b .binutils-pr-ld-13621
|
||||
%patch4 -p1 -b .xlatetom-835877
|
||||
%patch5 -p1 -b .dwz
|
||||
|
||||
find . -name \*.sh ! -perm -0100 -print | xargs chmod +x
|
||||
|
||||
@ -329,6 +331,9 @@ rm -rf ${RPM_BUILD_ROOT}
|
||||
%{_libdir}/libelf.a
|
||||
|
||||
%changelog
|
||||
* Wed Aug 01 2012 Mark Wielaard <mjw@redhat.com> 0.154-3
|
||||
- Add dwz support
|
||||
|
||||
* Mon Jul 18 2012 Mark Wielaard <mjw@redhat.com> 0.154-2
|
||||
- Add upstream xlatetom fix (#835877)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user