From 15867d77fc72513e597acd7683f100f6a16f5262 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Oct 30 2018 04:53:28 +0000 Subject: import elfutils-0.172-2.el7 --- diff --git a/.elfutils.metadata b/.elfutils.metadata index b9e2e20..fde5e19 100644 --- a/.elfutils.metadata +++ b/.elfutils.metadata @@ -1,2 +1 @@ -c5853d8c6e82ffe33de621f0c782b4802e0a6a67 SOURCES/elfutils-0.170.tar.bz2 -4d86da4d1503d5c54e3d640e006c82fdc2497648 SOURCES/testfile-sizes3.o.bz2 +3be219b5e19be33c0a19098f8de33b9258ddf9b0 SOURCES/elfutils-0.172.tar.bz2 diff --git a/.gitignore b/.gitignore index 7d2ba28..8abe0bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -SOURCES/elfutils-0.170.tar.bz2 -SOURCES/testfile-sizes3.o.bz2 +SOURCES/elfutils-0.172.tar.bz2 diff --git a/SOURCES/elfutils-0.170-dwarf_aggregate_size.patch b/SOURCES/elfutils-0.170-dwarf_aggregate_size.patch deleted file mode 100644 index 895458e..0000000 --- a/SOURCES/elfutils-0.170-dwarf_aggregate_size.patch +++ /dev/null @@ -1,170 +0,0 @@ -From a2246aaad96e062eb3bab55af9526aaa70adcfd0 Mon Sep 17 00:00:00 2001 -From: Dima Kogan -Date: Fri, 8 Dec 2017 01:45:10 -0800 -Subject: [PATCH 1/2] libdw: dwarf_aggregate_size() works with - multi-dimensional arrays - -If we have a multidimensional array of dimensions (a,b,c) the number of elements -should be a*b*c, but prior to this patch dwarf_aggregate_size() would report -a+b+c instead. - -This patch fixes the bug and adds a test that demonstrates the bug (the test -fails without the functional part of this patch). - -Fixes: https://sourceware.org/bugzilla/show_bug.cgi?id=22546 - -Signed-off-by: Dima Kogan ---- - libdw/ChangeLog | 5 +++++ - libdw/dwarf_aggregate_size.c | 43 ++++++++++++++++++++++--------------------- - tests/ChangeLog | 6 ++++++ - tests/run-aggregate-size.sh | 2 ++ - tests/run-peel-type.sh | 1 + - tests/testfile-sizes3.o.bz2 | Bin 1147 -> 1208 bytes - 6 files changed, 36 insertions(+), 21 deletions(-) - -diff --git a/libdw/dwarf_aggregate_size.c b/libdw/dwarf_aggregate_size.c -index 838468d..3010c0a 100644 ---- a/libdw/dwarf_aggregate_size.c -+++ b/libdw/dwarf_aggregate_size.c -@@ -63,7 +63,7 @@ array_size (Dwarf_Die *die, Dwarf_Word *size, - return -1; - - bool any = false; -- Dwarf_Word total = 0; -+ Dwarf_Word count_total = 1; - do - { - Dwarf_Word count; -@@ -134,34 +134,35 @@ array_size (Dwarf_Die *die, Dwarf_Word *size, - continue; - } - -- /* This is a subrange_type or enumeration_type and we've set COUNT. -- Now determine the stride for this array dimension. */ -- Dwarf_Word stride = eltsize; -- if (INTUSE(dwarf_attr_integrate) (&child, DW_AT_byte_stride, -- attr_mem) != NULL) -- { -- if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) -- return -1; -- } -- else if (INTUSE(dwarf_attr_integrate) (&child, DW_AT_bit_stride, -- attr_mem) != NULL) -- { -- if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) -- return -1; -- if (stride % 8) /* XXX maybe compute in bits? */ -- return -1; -- stride /= 8; -- } -+ count_total *= count; - - any = true; -- total += stride * count; - } - while (INTUSE(dwarf_siblingof) (&child, &child) == 0); - - if (!any) - return -1; - -- *size = total; -+ /* This is a subrange_type or enumeration_type and we've set COUNT. -+ Now determine the stride for this array. */ -+ Dwarf_Word stride = eltsize; -+ if (INTUSE(dwarf_attr_integrate) (die, DW_AT_byte_stride, -+ attr_mem) != NULL) -+ { -+ if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) -+ return -1; -+ } -+ else if (INTUSE(dwarf_attr_integrate) (die, DW_AT_bit_stride, -+ attr_mem) != NULL) -+ { -+ if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) -+ return -1; -+ if (stride % 8) /* XXX maybe compute in bits? */ -+ return -1; -+ stride /= 8; -+ } -+ -+ *size = count_total * stride; - return 0; - } - -diff --git a/tests/run-aggregate-size.sh b/tests/run-aggregate-size.sh -index 42b0742..6d8aa24 100755 ---- a/tests/run-aggregate-size.sh -+++ b/tests/run-aggregate-size.sh -@@ -54,6 +54,7 @@ - # volatile int ia[32]; - # const volatile void * const volatile restrict va[64]; - # struct s sa[8]; -+# double d3d[3][4][5]; - # - # typedef const int foo; - # typedef volatile foo bar; -@@ -98,6 +99,7 @@ ca size 16 - ia size 128 - va size 512 - sa size 128 -+d3d size 480 - f size 4 - b size 4 - EOF -diff --git a/tests/run-peel-type.sh b/tests/run-peel-type.sh -index 7fd96e8..668e316 100755 ---- a/tests/run-peel-type.sh -+++ b/tests/run-peel-type.sh -@@ -55,6 +55,7 @@ ca raw type array_type - ia raw type array_type - va raw type array_type - sa raw type array_type -+d3d raw type array_type - f raw type base_type - b raw type base_type - EOF - --- -1.8.3.1 - -From c25dc62e59dc42378370602b0d05415a42b051d6 Mon Sep 17 00:00:00 2001 -From: Mark Wielaard -Date: Mon, 11 Dec 2017 23:58:34 +0100 -Subject: [PATCH 2/2] libdw: dwarf_aggregate_size should not peel the given - DIE. - -Reserve memory for a new DIE first. The caller might not care, but it -isn't really nice to change the DIE the caller gave us. - -See also https://sourceware.org/bugzilla/show_bug.cgi?id=22546#c5 - -Signed-off-by: Mark Wielaard ---- - libdw/ChangeLog | 5 +++++ - libdw/dwarf_aggregate_size.c | 6 +++--- - 2 files changed, 8 insertions(+), 3 deletions(-) - -diff --git a/libdw/dwarf_aggregate_size.c b/libdw/dwarf_aggregate_size.c -index 3010c0a..6e50185 100644 ---- a/libdw/dwarf_aggregate_size.c -+++ b/libdw/dwarf_aggregate_size.c -@@ -199,12 +199,12 @@ aggregate_size (Dwarf_Die *die, Dwarf_Word *size, Dwarf_Die *type_mem) - int - dwarf_aggregate_size (Dwarf_Die *die, Dwarf_Word *size) - { -- Dwarf_Die type_mem; -+ Dwarf_Die die_mem, type_mem; - -- if (INTUSE (dwarf_peel_type) (die, die) != 0) -+ if (INTUSE (dwarf_peel_type) (die, &die_mem) != 0) - return -1; - -- return aggregate_size (die, size, &type_mem); -+ return aggregate_size (&die_mem, size, &type_mem); - } - INTDEF (dwarf_aggregate_size) - OLD_VERSION (dwarf_aggregate_size, ELFUTILS_0.144) --- -1.8.3.1 - diff --git a/SOURCES/elfutils-0.170-x86_64-backtrace-test-override.patch b/SOURCES/elfutils-0.170-x86_64-backtrace-test-override.patch deleted file mode 100644 index 408f7d6..0000000 --- a/SOURCES/elfutils-0.170-x86_64-backtrace-test-override.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/tests/backtrace-subr.sh b/tests/backtrace-subr.sh -index c1f3156..477df0b 100644 ---- a/tests/backtrace-subr.sh -+++ b/tests/backtrace-subr.sh -@@ -105,6 +105,12 @@ check_native_unsupported() - exit 77 - fi - ;; -+ x86_64 ) -+ if egrep 'backtrace: backtrace.c:114: callback_verify: Assertion' $err; then -+ echo >&2 $testname: temp override for x86_64 -+ exit 77 -+ fi -+ ;; - esac - } - diff --git a/SOURCES/elfutils-0.171-new-notes-hack.patch b/SOURCES/elfutils-0.171-new-notes-hack.patch new file mode 100644 index 0000000..f14562e --- /dev/null +++ b/SOURCES/elfutils-0.171-new-notes-hack.patch @@ -0,0 +1,30 @@ +diff --git a/src/elflint.c b/src/elflint.c +index df1b3a0..f4d82d9 100644 +--- a/src/elflint.c ++++ b/src/elflint.c +@@ -4329,6 +4329,8 @@ section [%2d] '%s': unknown core file note type %" PRIu32 + case NT_GNU_HWCAP: + case NT_GNU_BUILD_ID: + case NT_GNU_GOLD_VERSION: ++ case NT_GNU_PROPERTY_TYPE_0: ++ case 256: + break; + + case 0: +diff --git a/src/elflint.c b/src/elflint.c +index 0a26d97..1cbf570 100644 +--- a/src/elflint.c ++++ b/src/elflint.c +@@ -3906,10 +3906,11 @@ section [%2zu] '%s': size not multiple of entry size\n"), + cnt, section_name (ebl, cnt), + (int) shdr->sh_type); + ++#define SHF_GNU_BUILD_NOTE (1 << 20) + #define ALL_SH_FLAGS (SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR | SHF_MERGE \ + | SHF_STRINGS | SHF_INFO_LINK | SHF_LINK_ORDER \ + | SHF_OS_NONCONFORMING | SHF_GROUP | SHF_TLS \ +- | SHF_COMPRESSED) ++ | SHF_COMPRESSED | SHF_GNU_BUILD_NOTE) + if (shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS) + { + GElf_Xword sh_flags = shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS; diff --git a/SOURCES/elfutils-0.172-robustify.patch b/SOURCES/elfutils-0.172-robustify.patch new file mode 100644 index 0000000..da02527 --- /dev/null +++ b/SOURCES/elfutils-0.172-robustify.patch @@ -0,0 +1,400 @@ +Upstream commits since 0.172: + + b4dced3 readelf: While printing .debug_loc make sure that next_off doesn't overflow. + bb11e36 libdw: Make __libdw_dieabbrev more robust on failure. + 3647b5b readelf: Make sure print_form_data always consumes DW_FORM_strx[1234] data. + eaaf908 readelf: Check there are at least 4 bytes available for DWARF_FORM_block4. + 0d93f49 libdw, readelf: Don't handle DW_FORM_data16 as expression block/location. + 9495c26 libdw: aggregate_size check NULL result from get_type. + e636112 libdw: dwarf_peel_type break long chains/cycles. + 5956b8a libdw: Break dwarf_aggregate_size recursion because of type cycles. + ca0d831 libelf: Don't return unaligned data returned from elf_getdata[_rawchunk]. + +diff --git a/libdw/dwarf_aggregate_size.c b/libdw/dwarf_aggregate_size.c +index 6e50185..75105e4 100644 +--- a/libdw/dwarf_aggregate_size.c ++++ b/libdw/dwarf_aggregate_size.c +@@ -46,13 +46,17 @@ get_type (Dwarf_Die *die, Dwarf_Attribute *attr_mem, Dwarf_Die *type_mem) + return type; + } + ++static int aggregate_size (Dwarf_Die *die, Dwarf_Word *size, ++ Dwarf_Die *type_mem, int depth); ++ + static int + array_size (Dwarf_Die *die, Dwarf_Word *size, +- Dwarf_Attribute *attr_mem, Dwarf_Die *type_mem) ++ Dwarf_Attribute *attr_mem, int depth) + { + Dwarf_Word eltsize; +- if (INTUSE(dwarf_aggregate_size) (get_type (die, attr_mem, type_mem), +- &eltsize) != 0) ++ Dwarf_Die type_mem, aggregate_type_mem; ++ if (aggregate_size (get_type (die, attr_mem, &type_mem), &eltsize, ++ &aggregate_type_mem, depth) != 0) + return -1; + + /* An array can have DW_TAG_subrange_type or DW_TAG_enumeration_type +@@ -167,21 +171,30 @@ array_size (Dwarf_Die *die, Dwarf_Word *size, + } + + static int +-aggregate_size (Dwarf_Die *die, Dwarf_Word *size, Dwarf_Die *type_mem) ++aggregate_size (Dwarf_Die *die, Dwarf_Word *size, ++ Dwarf_Die *type_mem, int depth) + { + Dwarf_Attribute attr_mem; + ++/* Arrays of arrays of subrange types of arrays... Don't recurse too deep. */ ++#define MAX_DEPTH 256 ++ if (die == NULL || depth++ >= MAX_DEPTH) ++ return -1; ++ + if (INTUSE(dwarf_attr_integrate) (die, DW_AT_byte_size, &attr_mem) != NULL) + return INTUSE(dwarf_formudata) (&attr_mem, size); + + switch (INTUSE(dwarf_tag) (die)) + { + case DW_TAG_subrange_type: +- return aggregate_size (get_type (die, &attr_mem, type_mem), +- size, type_mem); /* Tail call. */ ++ { ++ Dwarf_Die aggregate_type_mem; ++ return aggregate_size (get_type (die, &attr_mem, type_mem), ++ size, &aggregate_type_mem, depth); ++ } + + case DW_TAG_array_type: +- return array_size (die, size, &attr_mem, type_mem); ++ return array_size (die, size, &attr_mem, depth); + + /* Assume references and pointers have pointer size if not given an + explicit DW_AT_byte_size. */ +@@ -204,7 +217,7 @@ dwarf_aggregate_size (Dwarf_Die *die, Dwarf_Word *size) + if (INTUSE (dwarf_peel_type) (die, &die_mem) != 0) + return -1; + +- return aggregate_size (&die_mem, size, &type_mem); ++ return aggregate_size (&die_mem, size, &type_mem, 0); + } + INTDEF (dwarf_aggregate_size) + OLD_VERSION (dwarf_aggregate_size, ELFUTILS_0.144) +diff --git a/libdw/dwarf_getlocation.c b/libdw/dwarf_getlocation.c +index 7f294fe..fc59a2a 100644 +--- a/libdw/dwarf_getlocation.c ++++ b/libdw/dwarf_getlocation.c +@@ -174,6 +174,8 @@ check_constant_offset (Dwarf_Attribute *attr, + default: + return 1; + ++ /* Note, we don't regard DW_FORM_data16 as a constant form, ++ even though technically it is according to the standard. */ + case DW_FORM_data1: + case DW_FORM_data2: + case DW_FORM_data4: +@@ -665,7 +667,13 @@ dwarf_getlocation (Dwarf_Attribute *attr, Dwarf_Op **llbuf, size_t *listlen) + if (result != 1) + return result; + +- /* If it has a block form, it's a single location expression. */ ++ /* If it has a block form, it's a single location expression. ++ Except for DW_FORM_data16, which is a 128bit constant. */ ++ if (attr->form == DW_FORM_data16) ++ { ++ __libdw_seterrno (DWARF_E_NO_BLOCK); ++ return -1; ++ } + Dwarf_Block block; + if (INTUSE(dwarf_formblock) (attr, &block) != 0) + return -1; +@@ -863,9 +871,11 @@ dwarf_getlocation_addr (Dwarf_Attribute *attr, Dwarf_Addr address, + if (llbufs == NULL) + maxlocs = SIZE_MAX; + +- /* If it has a block form, it's a single location expression. */ ++ /* If it has a block form, it's a single location expression. ++ Except for DW_FORM_data16, which is a 128bit constant. */ + Dwarf_Block block; +- if (INTUSE(dwarf_formblock) (attr, &block) == 0) ++ if (attr->form != DW_FORM_data16 ++ && INTUSE(dwarf_formblock) (attr, &block) == 0) + { + if (maxlocs == 0) + return 0; +@@ -876,11 +886,14 @@ dwarf_getlocation_addr (Dwarf_Attribute *attr, Dwarf_Addr address, + return listlens[0] == 0 ? 0 : 1; + } + +- int error = INTUSE(dwarf_errno) (); +- if (unlikely (error != DWARF_E_NO_BLOCK)) ++ if (attr->form != DW_FORM_data16) + { +- __libdw_seterrno (error); +- return -1; ++ int error = INTUSE(dwarf_errno) (); ++ if (unlikely (error != DWARF_E_NO_BLOCK)) ++ { ++ __libdw_seterrno (error); ++ return -1; ++ } + } + + int result = check_constant_offset (attr, &llbufs[0], &listlens[0]); +@@ -938,9 +951,11 @@ dwarf_getlocations (Dwarf_Attribute *attr, ptrdiff_t offset, Dwarf_Addr *basep, + + if (offset == 0) + { +- /* If it has a block form, it's a single location expression. */ ++ /* If it has a block form, it's a single location expression. ++ Except for DW_FORM_data16, which is a 128bit constant. */ + Dwarf_Block block; +- if (INTUSE(dwarf_formblock) (attr, &block) == 0) ++ if (attr->form != DW_FORM_data16 ++ && INTUSE(dwarf_formblock) (attr, &block) == 0) + { + if (getlocation (attr->cu, &block, expr, exprlen, + cu_sec_idx (attr->cu)) != 0) +@@ -952,11 +967,14 @@ dwarf_getlocations (Dwarf_Attribute *attr, ptrdiff_t offset, Dwarf_Addr *basep, + return 1; + } + +- int error = INTUSE(dwarf_errno) (); +- if (unlikely (error != DWARF_E_NO_BLOCK)) ++ if (attr->form != DW_FORM_data16) + { +- __libdw_seterrno (error); +- return -1; ++ int error = INTUSE(dwarf_errno) (); ++ if (unlikely (error != DWARF_E_NO_BLOCK)) ++ { ++ __libdw_seterrno (error); ++ return -1; ++ } + } + + int result = check_constant_offset (attr, expr, exprlen); +diff --git a/libdw/dwarf_peel_type.c b/libdw/dwarf_peel_type.c +index 6bbfd42..59fc6f1 100644 +--- a/libdw/dwarf_peel_type.c ++++ b/libdw/dwarf_peel_type.c +@@ -46,14 +46,19 @@ dwarf_peel_type (Dwarf_Die *die, Dwarf_Die *result) + + *result = *die; + tag = INTUSE (dwarf_tag) (result); +- while (tag == DW_TAG_typedef +- || tag == DW_TAG_const_type +- || tag == DW_TAG_volatile_type +- || tag == DW_TAG_restrict_type +- || tag == DW_TAG_atomic_type +- || tag == DW_TAG_immutable_type +- || tag == DW_TAG_packed_type +- || tag == DW_TAG_shared_type) ++ ++/* Stack 8 of all these modifiers, after that it gets silly. */ ++#define MAX_DEPTH (8 * 8) ++ int max_depth = MAX_DEPTH; ++ while ((tag == DW_TAG_typedef ++ || tag == DW_TAG_const_type ++ || tag == DW_TAG_volatile_type ++ || tag == DW_TAG_restrict_type ++ || tag == DW_TAG_atomic_type ++ || tag == DW_TAG_immutable_type ++ || tag == DW_TAG_packed_type ++ || tag == DW_TAG_shared_type) ++ && max_depth-- > 0) + { + Dwarf_Attribute attr_mem; + Dwarf_Attribute *attr = INTUSE (dwarf_attr_integrate) (result, DW_AT_type, +@@ -67,7 +72,7 @@ dwarf_peel_type (Dwarf_Die *die, Dwarf_Die *result) + tag = INTUSE (dwarf_tag) (result); + } + +- if (tag == DW_TAG_invalid) ++ if (tag == DW_TAG_invalid || max_depth <= 0) + return -1; + + return 0; +diff --git a/libdw/libdwP.h b/libdw/libdwP.h +index 3d8e145..eebb7d1 100644 +--- a/libdw/libdwP.h ++++ b/libdw/libdwP.h +@@ -653,8 +653,9 @@ __libdw_dieabbrev (Dwarf_Die *die, const unsigned char **readp) + /* Get the abbreviation code. */ + unsigned int code; + const unsigned char *addr = die->addr; +- if (die->cu == NULL || addr >= (const unsigned char *) die->cu->endp) +- return DWARF_END_ABBREV; ++ if (unlikely (die->cu == NULL ++ || addr >= (const unsigned char *) die->cu->endp)) ++ return die->abbrev = DWARF_END_ABBREV; + get_uleb128 (code, addr, die->cu->endp); + if (readp != NULL) + *readp = addr; +diff --git a/libdw/memory-access.h b/libdw/memory-access.h +index 22918cb..a39ad6d 100644 +--- a/libdw/memory-access.h ++++ b/libdw/memory-access.h +@@ -362,6 +362,11 @@ read_3ubyte_unaligned (Dwarf *dbg, const unsigned char *p) + } + + ++#define read_3ubyte_unaligned_inc(Dbg, Addr) \ ++ ({ uint32_t t_ = read_2ubyte_unaligned (Dbg, Addr); \ ++ Addr = (__typeof (Addr)) (((uintptr_t) (Addr)) + 3); \ ++ t_; }) ++ + #define read_addr_unaligned_inc(Nbytes, Dbg, Addr) \ + (assert ((Nbytes) == 4 || (Nbytes) == 8), \ + ((Nbytes) == 4 ? read_4ubyte_unaligned_inc (Dbg, Addr) \ +diff --git a/libelf/elf_getdata.c b/libelf/elf_getdata.c +index 97c503b..278dfa8 100644 +--- a/libelf/elf_getdata.c ++++ b/libelf/elf_getdata.c +@@ -76,7 +76,6 @@ static const Elf_Type shtype_map[EV_NUM - 1][TYPEIDX (SHT_HISUNW) + 1] = + } + }; + +-#if !ALLOW_UNALIGNED + /* Associate libelf types with their internal alignment requirements. */ + const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] = + { +@@ -115,7 +114,6 @@ const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] + } + # undef TYPE_ALIGNS + }; +-#endif + + + Elf_Type +@@ -173,8 +171,7 @@ convert_data (Elf_Scn *scn, int version __attribute__ ((unused)), int eclass, + /* Make sure the source is correctly aligned for the conversion + function to directly access the data elements. */ + char *rawdata_source; +- if (ALLOW_UNALIGNED || +- ((((size_t) (char *) scn->rawdata_base)) & (align - 1)) == 0) ++ if (((((size_t) (char *) scn->rawdata_base)) & (align - 1)) == 0) + rawdata_source = scn->rawdata_base; + else + { +diff --git a/libelf/elf_getdata_rawchunk.c b/libelf/elf_getdata_rawchunk.c +index 31b2fe7..d0c0b75 100644 +--- a/libelf/elf_getdata_rawchunk.c ++++ b/libelf/elf_getdata_rawchunk.c +@@ -80,8 +80,7 @@ elf_getdata_rawchunk (Elf *elf, off_t offset, size_t size, Elf_Type type) + { + /* If the file is mmap'ed we can use it directly, if aligned for type. */ + char *rawdata = elf->map_address + elf->start_offset + offset; +- if (ALLOW_UNALIGNED || +- ((uintptr_t) rawdata & (align - 1)) == 0) ++ if (((uintptr_t) rawdata & (align - 1)) == 0) + rawchunk = rawdata; + else + { +diff --git a/libelf/libelfP.h b/libelf/libelfP.h +index ca805ac..ed216c8 100644 +--- a/libelf/libelfP.h ++++ b/libelf/libelfP.h +@@ -443,15 +443,11 @@ extern int __libelf_version_initialized attribute_hidden; + # define LIBELF_EV_IDX (__libelf_version - 1) + #endif + +-#if !ALLOW_UNALIGNED + /* Array with alignment requirements of the internal types indexed by ELF + version, binary class, and type. */ + extern const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] attribute_hidden; + # define __libelf_type_align(class, type) \ + (__libelf_type_aligns[LIBELF_EV_IDX][class - 1][type] ?: 1) +-#else +-# define __libelf_type_align(class, type) 1 +-#endif + + /* Given an Elf handle and a section type returns the Elf_Data d_type. + Should not be called when SHF_COMPRESSED is set, the d_type should +diff --git a/src/readelf.c b/src/readelf.c +index f185897..313f940 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -7403,11 +7403,16 @@ attr_callback (Dwarf_Attribute *attrp, void *arg) + case DW_AT_GNU_call_site_data_value: + case DW_AT_GNU_call_site_target: + case DW_AT_GNU_call_site_target_clobbered: +- putchar ('\n'); +- print_ops (cbargs->dwflmod, cbargs->dbg, +- 12 + level * 2, 12 + level * 2, +- cbargs->version, cbargs->addrsize, cbargs->offset_size, +- attrp->cu, block.length, block.data); ++ if (form != DW_FORM_data16) ++ { ++ putchar ('\n'); ++ print_ops (cbargs->dwflmod, cbargs->dbg, ++ 12 + level * 2, 12 + level * 2, ++ cbargs->version, cbargs->addrsize, cbargs->offset_size, ++ attrp->cu, block.length, block.data); ++ } ++ else ++ print_block (block.length, block.data); + break; + } + break; +@@ -7907,7 +7912,7 @@ print_form_data (Dwarf *dbg, int form, const unsigned char *readp, + break; + + case DW_FORM_block4: +- if (readendp - readp < 2) ++ if (readendp - readp < 4) + goto invalid_data; + val = read_4ubyte_unaligned_inc (dbg, readp); + if ((size_t) (readendp - readp) < val) +@@ -7994,9 +7999,9 @@ print_form_data (Dwarf *dbg, int form, const unsigned char *readp, + { + Dwarf_Off idx; + if (offset_len == 8) +- idx = read_8ubyte_unaligned_inc (dbg, strreadp); ++ idx = read_8ubyte_unaligned (dbg, strreadp); + else +- idx = read_4ubyte_unaligned_inc (dbg, strreadp); ++ idx = read_4ubyte_unaligned (dbg, strreadp); + + data = dbg->sectiondata[IDX_debug_str]; + if (data == NULL || idx >= data->d_size +@@ -8013,25 +8018,25 @@ print_form_data (Dwarf *dbg, int form, const unsigned char *readp, + case DW_FORM_strx1: + if (readendp - readp < 1) + goto invalid_data; +- val = *readp; ++ val = *readp++; + goto strx_val; + + case DW_FORM_strx2: + if (readendp - readp < 2) + goto invalid_data; +- val = read_2ubyte_unaligned (dbg, readp); ++ val = read_2ubyte_unaligned_inc (dbg, readp); + goto strx_val; + + case DW_FORM_strx3: + if (readendp - readp < 3) + goto invalid_data; +- val = read_3ubyte_unaligned (dbg, readp); ++ val = read_3ubyte_unaligned_inc (dbg, readp); + goto strx_val; + + case DW_FORM_strx4: + if (readendp - readp < 4) + goto invalid_data; +- val = read_4ubyte_unaligned (dbg, readp); ++ val = read_4ubyte_unaligned_inc (dbg, readp); + goto strx_val; + + default: +@@ -9230,7 +9235,9 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + listptr_idx); + const unsigned char *locp = readp; + const unsigned char *locendp; +- if (next_off == 0) ++ if (next_off == 0 ++ || next_off > (size_t) (endp ++ - (const unsigned char *) data->d_buf)) + locendp = endp; + else + locendp = (const unsigned char *) data->d_buf + next_off; diff --git a/SPECS/elfutils.spec b/SPECS/elfutils.spec index 5c1a31b..adec855 100644 --- a/SPECS/elfutils.spec +++ b/SPECS/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data -Version: 0.170 -%global baserelease 4 +Version: 0.172 +%global baserelease 2 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -20,10 +20,8 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches -Patch1: elfutils-0.170-dwarf_aggregate_size.patch -Source1: testfile-sizes3.o.bz2 - -Patch2: elfutils-0.170-x86_64-backtrace-test-override.patch +Patch1: elfutils-0.171-new-notes-hack.patch +Patch2: elfutils-0.172-robustify.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -33,6 +31,8 @@ BuildRequires: bison >= 1.875 BuildRequires: flex >= 2.5.4a BuildRequires: bzip2 BuildRequires: gcc >= 4.4 +# For libstdc++ demangle support +BuildRequires: libstdc++-devel BuildRequires: zlib-devel >= 1.2.2.3 BuildRequires: bzip2-devel @@ -175,13 +175,11 @@ profiling) of processes. %setup -q # Apply patches -%patch1 -p1 -b .aggregate_size -cp %SOURCE1 tests/ - -# This is only necessary for the RHEL brew build host, which seems to -# generate a corrupt core file which we cannot test properly. -%patch2 -p1 -b .x86_64_override +%patch1 -p1 -b .notes_hack +%patch2 -p1 -b .robustify +# In case the above patches added any new test scripts, make sure they +# are executable. find . -name \*.sh ! -perm -0100 -print | xargs chmod +x %build @@ -318,6 +316,32 @@ fi %endif %changelog +* Wed Jun 20 2018 Mark Wielaard - 0.172-2 +- Add elfutils-0.172-robustify.patch. (#1593328) + +* Mon Jun 11 2018 Mark Wielaard - 0.172-1 +- New upstream release. + - No functional changes compared to 0.171. + - Various bug fixes in libdw and eu-readelf dealing with bad DWARF5 + data. Thanks to running the afl fuzzer on eu-readelf and various + testcases. + - eu-readelf -N is ~15% faster. + +* Tue Jun 05 2018 Mark Wielaard - 0.171-1 +- New upstream release. + - DWARF5 and split dwarf, including GNU DebugFission, support. + - readelf: Handle all new DWARF5 sections. + --debug-dump=info+ will show split unit DIEs when found. + --dwarf-skeleton can be used when inspecting a .dwo file. + Recognizes GNU locviews with --debug-dump=loc. + - libdw: New functions dwarf_die_addr_die, dwarf_get_units, + dwarf_getabbrevattr_data and dwarf_cu_info. + libdw will now try to resolve the alt file on first use + when not set yet with dwarf_set_alt. + dwarf_aggregate_size() now works with multi-dimensional arrays. + - libdwfl: Use process_vm_readv when available instead of ptrace. + - backends: Add a RISC-V backend. + * Wed Dec 20 2017 Mark Wielaard - 0.170-4 - Add elfutils-0.170-dwarf_aggregate_size.patch (#1527966).