diff --git a/elfutils-0.170-locviews.patch b/elfutils-0.170-locviews.patch new file mode 100644 index 0000000..3709e7b --- /dev/null +++ b/elfutils-0.170-locviews.patch @@ -0,0 +1,1270 @@ +commit 704f5fc477efaf120980449e677deb563da8491f +Author: Mark Wielaard +Date: Wed Nov 29 15:43:26 2017 +0100 + + readelf: Adjust print_ops formatting. + + Use only 2 spaces for index (there are never 10000, the most seen in the + wild is 64). Adjust re-indenting after GNU_entry_value. + + Signed-off-by: Mark Wielaard + +diff --git a/src/readelf.c b/src/readelf.c +index a9168d1..2faa1d5 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -1,5 +1,5 @@ + /* Print information from ELF file in human-readable form. +- Copyright (C) 1999-2016 Red Hat, Inc. ++ Copyright (C) 1999-2017 Red Hat, Inc. + This file is part of elfutils. + Written by Ulrich Drepper , 1999. + +@@ -4152,7 +4152,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + CONSUME (addrsize); + + char *a = format_dwarf_addr (dwflmod, 0, addr, addr); +- printf ("%*s[%4" PRIuMAX "] %s %s\n", ++ printf ("%*s[%2" PRIuMAX "] %s %s\n", + indent, "", (uintmax_t) offset, op_name, a); + free (a); + +@@ -4172,7 +4172,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + data += ref_size; + CONSUME (ref_size); + /* addr is a DIE offset, so format it as one. */ +- printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n", ++ printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "]\n", + indent, "", (uintmax_t) offset, + op_name, (uintmax_t) addr); + offset += 1 + ref_size; +@@ -4184,7 +4184,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const1u: + // XXX value might be modified by relocation + NEED (1); +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu8 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu8 "\n", + indent, "", (uintmax_t) offset, + op_name, *((uint8_t *) data)); + ++data; +@@ -4195,7 +4195,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const2u: + NEED (2); + // XXX value might be modified by relocation +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu16 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu16 "\n", + indent, "", (uintmax_t) offset, + op_name, read_2ubyte_unaligned (dbg, data)); + CONSUME (2); +@@ -4206,7 +4206,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const4u: + NEED (4); + // XXX value might be modified by relocation +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu32 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu32 "\n", + indent, "", (uintmax_t) offset, + op_name, read_4ubyte_unaligned (dbg, data)); + CONSUME (4); +@@ -4217,7 +4217,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const8u: + NEED (8); + // XXX value might be modified by relocation +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 "\n", + indent, "", (uintmax_t) offset, + op_name, (uint64_t) read_8ubyte_unaligned (dbg, data)); + CONSUME (8); +@@ -4228,7 +4228,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const1s: + NEED (1); + // XXX value might be modified by relocation +- printf ("%*s[%4" PRIuMAX "] %s %" PRId8 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRId8 "\n", + indent, "", (uintmax_t) offset, + op_name, *((int8_t *) data)); + ++data; +@@ -4239,7 +4239,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const2s: + NEED (2); + // XXX value might be modified by relocation +- printf ("%*s[%4" PRIuMAX "] %s %" PRId16 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRId16 "\n", + indent, "", (uintmax_t) offset, + op_name, read_2sbyte_unaligned (dbg, data)); + CONSUME (2); +@@ -4250,7 +4250,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const4s: + NEED (4); + // XXX value might be modified by relocation +- printf ("%*s[%4" PRIuMAX "] %s %" PRId32 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRId32 "\n", + indent, "", (uintmax_t) offset, + op_name, read_4sbyte_unaligned (dbg, data)); + CONSUME (4); +@@ -4261,7 +4261,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const8s: + NEED (8); + // XXX value might be modified by relocation +- printf ("%*s[%4" PRIuMAX "] %s %" PRId64 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRId64 "\n", + indent, "", (uintmax_t) offset, + op_name, read_8sbyte_unaligned (dbg, data)); + CONSUME (8); +@@ -4277,7 +4277,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + uint64_t uleb; + NEED (1); + get_uleb128 (uleb, data, data + len); +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 "\n", + indent, "", (uintmax_t) offset, op_name, uleb); + CONSUME (data - start); + offset += 1 + (data - start); +@@ -4290,7 +4290,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + get_uleb128 (uleb, data, data + len); + NEED (1); + get_uleb128 (uleb2, data, data + len); +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 ", %" PRIu64 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 ", %" PRIu64 "\n", + indent, "", (uintmax_t) offset, op_name, uleb, uleb2); + CONSUME (data - start); + offset += 1 + (data - start); +@@ -4303,7 +4303,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + int64_t sleb; + NEED (1); + get_sleb128 (sleb, data, data + len); +- printf ("%*s[%4" PRIuMAX "] %s %" PRId64 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRId64 "\n", + indent, "", (uintmax_t) offset, op_name, sleb); + CONSUME (data - start); + offset += 1 + (data - start); +@@ -4315,7 +4315,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + get_uleb128 (uleb, data, data + len); + NEED (1); + get_sleb128 (sleb, data, data + len); +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 " %" PRId64 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 " %" PRId64 "\n", + indent, "", (uintmax_t) offset, op_name, uleb, sleb); + CONSUME (data - start); + offset += 1 + (data - start); +@@ -4323,7 +4323,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + + case DW_OP_call2: + NEED (2); +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu16 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu16 "\n", + indent, "", (uintmax_t) offset, op_name, + read_2ubyte_unaligned (dbg, data)); + CONSUME (2); +@@ -4332,7 +4332,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + + case DW_OP_call4: + NEED (4); +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu32 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu32 "\n", + indent, "", (uintmax_t) offset, op_name, + read_4ubyte_unaligned (dbg, data)); + CONSUME (4); +@@ -4342,7 +4342,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_skip: + case DW_OP_bra: + NEED (2); +- printf ("%*s[%4" PRIuMAX "] %s %" PRIuMAX "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIuMAX "\n", + indent, "", (uintmax_t) offset, op_name, + (uintmax_t) (offset + read_2sbyte_unaligned (dbg, data) + 3)); + CONSUME (2); +@@ -4354,7 +4354,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + start = data; + NEED (1); + get_uleb128 (uleb, data, data + len); +- printf ("%*s[%4" PRIuMAX "] %s: ", ++ printf ("%*s[%2" PRIuMAX "] %s: ", + indent, "", (uintmax_t) offset, op_name); + NEED (uleb); + print_block (uleb, data); +@@ -4378,7 +4378,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + NEED (1); + get_sleb128 (sleb, data, data + len); + +- printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "] %+" PRId64 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "] %+" PRId64 "\n", + indent, "", (intmax_t) offset, + op_name, (uintmax_t) addr, sleb); + CONSUME (data - start); +@@ -4390,10 +4390,10 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + start = data; + NEED (1); + get_uleb128 (uleb, data, data + len); +- printf ("%*s[%4" PRIuMAX "] %s:\n", ++ printf ("%*s[%2" PRIuMAX "] %s:\n", + indent, "", (uintmax_t) offset, op_name); + NEED (uleb); +- print_ops (dwflmod, dbg, indent + 6, indent + 6, vers, ++ print_ops (dwflmod, dbg, indent + 5, indent + 5, vers, + addrsize, offset_size, cu, uleb, data); + data += uleb; + CONSUME (data - start); +@@ -4411,7 +4411,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + NEED (1); + uint8_t usize = *(uint8_t *) data++; + NEED (usize); +- printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "] ", ++ printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "] ", + indent, "", (uintmax_t) offset, op_name, uleb); + print_block (usize, data); + data += usize; +@@ -4429,7 +4429,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + get_uleb128 (uleb2, data, data + len); + if (! print_unresolved_addresses && cu != NULL) + uleb2 += cu->start; +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 " [%6" PRIx64 "]\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 " [%6" PRIx64 "]\n", + indent, "", (uintmax_t) offset, op_name, uleb, uleb2); + CONSUME (data - start); + offset += 1 + (data - start); +@@ -4445,7 +4445,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + get_uleb128 (uleb, data, data + len); + if (! print_unresolved_addresses && cu != NULL) + uleb += cu->start; +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu8 " [%6" PRIxMAX "]\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu8 " [%6" PRIxMAX "]\n", + indent, "", (uintmax_t) offset, + op_name, usize, uleb); + CONSUME (data - start); +@@ -4461,7 +4461,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + get_uleb128 (uleb, data, data + len); + if (uleb != 0 && ! print_unresolved_addresses && cu != NULL) + uleb += cu->start; +- printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n", ++ printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "]\n", + indent, "", (uintmax_t) offset, op_name, uleb); + CONSUME (data - start); + offset += 1 + (data - start); +@@ -4474,7 +4474,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + uintmax_t param_off = (uintmax_t) read_4ubyte_unaligned (dbg, data); + if (! print_unresolved_addresses && cu != NULL) + param_off += cu->start; +- printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n", ++ printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "]\n", + indent, "", (uintmax_t) offset, op_name, param_off); + CONSUME (4); + data += 4; +@@ -4483,7 +4483,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + + default: + /* No Operand. */ +- printf ("%*s[%4" PRIuMAX "] %s\n", ++ printf ("%*s[%2" PRIuMAX "] %s\n", + indent, "", (uintmax_t) offset, op_name); + ++offset; + break; +@@ -4493,7 +4493,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + continue; + + invalid: +- printf (gettext ("%*s[%4" PRIuMAX "] %s \n"), ++ printf (gettext ("%*s[%2" PRIuMAX "] %s \n"), + indent, "", (uintmax_t) offset, op_name); + break; + } +diff --git a/tests/run-readelf-dwz-multi.sh b/tests/run-readelf-dwz-multi.sh +index 23ca944..139b8c1 100755 +--- a/tests/run-readelf-dwz-multi.sh ++++ b/tests/run-readelf-dwz-multi.sh +@@ -107,7 +107,7 @@ DWARF section [28] '.debug_info' at offset 0x1078: + low_pc (addr) 0x00000000004006ac
+ high_pc (udata) 44 (0x00000000004006d8) + frame_base (exprloc) +- [ 0] call_frame_cfa ++ [ 0] call_frame_cfa + GNU_all_tail_call_sites (flag_present) yes + sibling (ref_udata) [ 6e] + [ 48] formal_parameter +@@ -116,21 +116,21 @@ DWARF section [28] '.debug_info' at offset 0x1078: + decl_line (data1) 3 + type (GNU_ref_alt) [ 3e] + location (exprloc) +- [ 0] fbreg -36 ++ [ 0] fbreg -36 + [ 56] formal_parameter + name (strp) "argv" + decl_file (data1) 1 + decl_line (data1) 3 + type (ref_udata) [ 6e] + location (exprloc) +- [ 0] fbreg -48 ++ [ 0] fbreg -48 + [ 61] variable + name (string) "b" + decl_file (data1) 1 + decl_line (data1) 5 + type (GNU_ref_alt) [ 5a] + location (exprloc) +- [ 0] fbreg -32 ++ [ 0] fbreg -32 + [ 6e] pointer_type + byte_size (data1) 8 + type (ref_udata) [ 2b] +@@ -168,7 +168,7 @@ DWARF section [28] '.debug_info' at offset 0x1078: + low_pc (addr) 0x00000000004006ac
+ high_pc (udata) 44 (0x00000000004006d8) + frame_base (exprloc) +- [ 0] call_frame_cfa ++ [ 0] call_frame_cfa + GNU_all_tail_call_sites (flag_present) yes + sibling (ref_udata) [ 6e] + [ 48] formal_parameter +@@ -177,21 +177,21 @@ DWARF section [28] '.debug_info' at offset 0x1078: + decl_line (data1) 3 + type (GNU_ref_alt) [ 3e] + location (exprloc) +- [ 0] fbreg -36 ++ [ 0] fbreg -36 + [ 56] formal_parameter + name (strp) "argv" + decl_file (data1) 1 + decl_line (data1) 3 + type (ref_udata) [ 6e] + location (exprloc) +- [ 0] fbreg -48 ++ [ 0] fbreg -48 + [ 61] variable + name (string) "b" + decl_file (data1) 1 + decl_line (data1) 5 + type (GNU_ref_alt) [ 5a] + location (exprloc) +- [ 0] fbreg -32 ++ [ 0] fbreg -32 + [ 6e] pointer_type + byte_size (data1) 8 + type (ref_udata) [ 2b] +@@ -225,7 +225,7 @@ DWARF section [25] '.debug_info' at offset 0x106c: + low_pc (addr) +0x0000000000000670 + high_pc (udata) 23 (+0x0000000000000687) + frame_base (exprloc) +- [ 0] call_frame_cfa ++ [ 0] call_frame_cfa + GNU_all_call_sites (flag_present) yes + [ 41] formal_parameter + name (string) "fb" +@@ -233,7 +233,7 @@ DWARF section [25] '.debug_info' at offset 0x106c: + decl_line (data1) 3 + type (GNU_ref_alt) [ 76] + location (exprloc) +- [ 0] fbreg -24 ++ [ 0] fbreg -24 + EOF + + # Same as above, but find alt debug file in a .dwz subdir. +@@ -265,7 +265,7 @@ DWARF section [25] '.debug_info' at offset 0x106c: + low_pc (addr) +0x0000000000000670 + high_pc (udata) 23 (+0x0000000000000687) + frame_base (exprloc) +- [ 0] call_frame_cfa ++ [ 0] call_frame_cfa + GNU_all_call_sites (flag_present) yes + [ 41] formal_parameter + name (string) "fb" +@@ -273,7 +273,7 @@ DWARF section [25] '.debug_info' at offset 0x106c: + decl_line (data1) 3 + type (GNU_ref_alt) [ 76] + location (exprloc) +- [ 0] fbreg -24 ++ [ 0] fbreg -24 + EOF + mv .dwz/testfile_multi.dwz . + rmdir .dwz +@@ -304,7 +304,7 @@ DWARF section [28] '.debug_info' at offset 0x1088: + low_pc (addr) 0x00000000004004ec
+ high_pc (udata) 18 (0x00000000004004fe) + frame_base (exprloc) +- [ 0] call_frame_cfa ++ [ 0] call_frame_cfa + GNU_all_call_sites (flag_present) yes + [ 41] formal_parameter + name (GNU_strp_alt) "argc" +@@ -312,21 +312,21 @@ DWARF section [28] '.debug_info' at offset 0x1088: + decl_line (data1) 8 + type (GNU_ref_alt) [ 30] + location (exprloc) +- [ 0] fbreg -36 ++ [ 0] fbreg -36 + [ 4f] formal_parameter + name (GNU_strp_alt) "argv" + decl_file (data1) 1 + decl_line (data1) 8 + type (GNU_ref_alt) [ 41] + location (exprloc) +- [ 0] fbreg -48 ++ [ 0] fbreg -48 + [ 5d] variable + name (string) "fbb" + decl_file (data1) 1 + decl_line (data1) 10 + type (GNU_ref_alt) [ 14] + location (exprloc) +- [ 0] fbreg -32 ++ [ 0] fbreg -32 + EOF + + exit 0 +diff --git a/tests/run-readelf-loc.sh b/tests/run-readelf-loc.sh +index 98870fc..3959d3d 100755 +--- a/tests/run-readelf-loc.sh ++++ b/tests/run-readelf-loc.sh +@@ -63,9 +63,9 @@ testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=loc --debug-dump=ra + testfileloc<<\EOF + + DWARF section [33] '.debug_loc' at offset 0xd2a: +- [ 0] 0x0000000000400480
..0x000000000040048d [ 0] reg5 +- [ 23] 0x0000000000400485 ..0x000000000040048d [ 0] reg5 +- [ 46] 0x00000000004004b2 ..0x00000000004004ba [ 0] breg5 0 ++ [ 0] 0x0000000000400480
..0x000000000040048d [ 0] reg5 ++ [ 23] 0x0000000000400485 ..0x000000000040048d [ 0] reg5 ++ [ 46] 0x00000000004004b2 ..0x00000000004004ba [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: + [ 0] 0x0000000000400480
..0x0000000000400482 +@@ -79,9 +79,9 @@ testrun_compare ${abs_top_builddir}/src/readelf -N --debug-dump=loc --debug-dump + testfileloc<<\EOF + + DWARF section [33] '.debug_loc' at offset 0xd2a: +- [ 0] 0x0000000000400480..0x000000000040048d [ 0] reg5 +- [ 23] 0x0000000000400485..0x000000000040048d [ 0] reg5 +- [ 46] 0x00000000004004b2..0x00000000004004ba [ 0] breg5 0 ++ [ 0] 0x0000000000400480..0x000000000040048d [ 0] reg5 ++ [ 23] 0x0000000000400485..0x000000000040048d [ 0] reg5 ++ [ 46] 0x00000000004004b2..0x00000000004004ba [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: + [ 0] 0x0000000000400480..0x0000000000400482 +@@ -95,9 +95,9 @@ testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc --debug-dump + testfileloc<<\EOF + + DWARF section [33] '.debug_loc' at offset 0xd2a: +- [ 0] 000000000000000000..0x000000000000000d [ 0] reg5 +- [ 23] 0x0000000000000005..0x000000000000000d [ 0] reg5 +- [ 46] 0x0000000000000012..0x000000000000001a [ 0] breg5 0 ++ [ 0] 000000000000000000..0x000000000000000d [ 0] reg5 ++ [ 23] 0x0000000000000005..0x000000000000000d [ 0] reg5 ++ [ 46] 0x0000000000000012..0x000000000000001a [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: + [ 0] 000000000000000000..0x0000000000000002 +diff --git a/tests/run-readelf-zdebug-rel.sh b/tests/run-readelf-zdebug-rel.sh +index 1232d63..082971e 100755 +--- a/tests/run-readelf-zdebug-rel.sh ++++ b/tests/run-readelf-zdebug-rel.sh +@@ -69,7 +69,7 @@ DWARF section [ 4] '.debug_info' at offset 0x58: + low_pc (addr) 000000000000000000 + high_pc (data8) 24 (0x0000000000000018) + frame_base (exprloc) +- [ 0] call_frame_cfa ++ [ 0] call_frame_cfa + GNU_all_call_sites (flag_present) yes + sibling (ref4) [ 80] + [ 4e] formal_parameter +@@ -84,7 +84,7 @@ DWARF section [ 4] '.debug_info' at offset 0x58: + decl_line (data1) 4 + type (ref4) [ 87] + location (exprloc) +- [ 0] reg4 ++ [ 0] reg4 + [ 6a] variable + name (string) "a" + decl_file (data1) 1 +@@ -97,7 +97,7 @@ DWARF section [ 4] '.debug_info' at offset 0x58: + decl_line (data1) 7 + type (ref4) [ 9a] + location (exprloc) +- [ 0] reg5 ++ [ 0] reg5 + [ 80] base_type + byte_size (data1) 4 + encoding (data1) signed (5) +@@ -127,12 +127,12 @@ cat info.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=i + cat > loc.out << \EOF + + DWARF section [ 7] '.debug_loc' at offset 0x185: +- [ 0] 000000000000000000..0x0000000000000003 [ 0] reg5 +- 0x0000000000000003..0x0000000000000010 [ 0] breg5 -42 +- [ 2] stack_value +- 0x0000000000000010..0x0000000000000018 [ 0] GNU_entry_value: +- [ 0] reg5 +- [ 3] stack_value ++ [ 0] 000000000000000000..0x0000000000000003 [ 0] reg5 ++ 0x0000000000000003..0x0000000000000010 [ 0] breg5 -42 ++ [ 2] stack_value ++ 0x0000000000000010..0x0000000000000018 [ 0] GNU_entry_value: ++ [ 0] reg5 ++ [ 3] stack_value + EOF + + cat loc.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug-rel.o +diff --git a/tests/run-readelf-zdebug.sh b/tests/run-readelf-zdebug.sh +index 37cf7ea..fc666fd 100755 +--- a/tests/run-readelf-zdebug.sh ++++ b/tests/run-readelf-zdebug.sh +@@ -46,12 +46,12 @@ tempfiles loc.out aranges.out ranges.out macro.out line.out frame.out + cat > loc.out << \EOF + + DWARF section [30] '.debug_loc' at offset 0xa17: +- [ 0] 0x00000000004003c0..0x00000000004003c3 [ 0] reg5 +- 0x00000000004003c3..0x00000000004003d6 [ 0] breg5 -42 +- [ 2] stack_value +- 0x00000000004003d6..0x00000000004003d9 [ 0] GNU_entry_value: +- [ 0] reg5 +- [ 3] stack_value ++ [ 0] 0x00000000004003c0..0x00000000004003c3 [ 0] reg5 ++ 0x00000000004003c3..0x00000000004003d6 [ 0] breg5 -42 ++ [ 2] stack_value ++ 0x00000000004003d6..0x00000000004003d9 [ 0] GNU_entry_value: ++ [ 0] reg5 ++ [ 3] stack_value + EOF + + cat loc.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug +@@ -476,15 +476,15 @@ Call frame information section [16] '.eh_frame' at offset 0x5b8: + def_cfa_offset 24 + advance_loc 10 to 0x3b0 + def_cfa_expression 11 +- [ 0] breg7 8 +- [ 2] breg16 0 +- [ 4] lit15 +- [ 5] and +- [ 6] lit11 +- [ 7] ge +- [ 8] lit3 +- [ 9] shl +- [ 10] plus ++ [ 0] breg7 8 ++ [ 2] breg16 0 ++ [ 4] lit15 ++ [ 5] and ++ [ 6] lit11 ++ [ 7] ge ++ [ 8] lit3 ++ [ 9] shl ++ [10] plus + nop + nop + nop + +commit 36eabdb739b16b934afe318c786a97c94b47bbf6 +Author: Mark Wielaard +Date: Wed Nov 29 16:27:33 2017 +0100 + + readelf: Print CU, base address and unresolved .debug_range entries. + + Also adjust the formatting for the resolved addresses to print them + on separate lines so they nicely line up even when the addresses are + resolved to symbol+offset names. + + Signed-off-by: Mark Wielaard + +diff --git a/src/readelf.c b/src/readelf.c +index 8661ba8..8e13462 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -5007,15 +5007,33 @@ print_debug_ranges_section (Dwfl_Module *dwflmod, + Dwarf_Addr base = 0; + unsigned char *const endp = (unsigned char *) data->d_buf + data->d_size; + unsigned char *readp = data->d_buf; ++ Dwarf_CU *last_cu = NULL; + while (readp < endp) + { + ptrdiff_t offset = readp - (unsigned char *) data->d_buf; ++ Dwarf_CU *cu; + + if (first && skip_listptr_hole (&known_rangelistptr, &listptr_idx, +- &address_size, NULL, &base, NULL, ++ &address_size, NULL, &base, &cu, + offset, &readp, endp)) + continue; + ++ if (last_cu != cu) ++ { ++ char *basestr = format_dwarf_addr (dwflmod, address_size, ++ base, base); ++ Dwarf_Die cudie; ++ if (dwarf_cu_die (cu, &cudie, ++ NULL, NULL, NULL, NULL, ++ NULL, NULL) == NULL) ++ printf (gettext ("\n Unknown CU base: %s\n"), basestr); ++ else ++ printf (gettext ("\n CU [%6" PRIx64 "] base: %s\n"), ++ dwarf_dieoffset (&cudie), basestr); ++ free (basestr); ++ } ++ last_cu = cu; ++ + if (unlikely (data->d_size - offset < (size_t) address_size * 2)) + { + printf (gettext (" [%6tx] \n"), offset); +@@ -5040,29 +5058,36 @@ print_debug_ranges_section (Dwfl_Module *dwflmod, + if (begin == (Dwarf_Addr) -1l) /* Base address entry. */ + { + char *b = format_dwarf_addr (dwflmod, address_size, end, end); +- printf (gettext (" [%6tx] base address %s\n"), offset, b); ++ printf (gettext (" [%6tx] base address\n %s\n"), offset, b); + free (b); + base = end; + } + else if (begin == 0 && end == 0) /* End of list entry. */ + { + if (first) +- printf (gettext (" [%6tx] empty list\n"), offset); ++ printf (gettext (" [%6tx] empty list\n"), offset); + first = true; + } + else + { +- char *b = format_dwarf_addr (dwflmod, address_size, base + begin, +- begin); +- char *e = format_dwarf_addr (dwflmod, address_size, base + end, +- end); + /* We have an address range entry. */ + if (first) /* First address range entry in a list. */ +- printf (gettext (" [%6tx] %s..%s\n"), offset, b, e); ++ printf (" [%6tx] ", offset); + else +- printf (gettext (" %s..%s\n"), b, e); +- free (b); +- free (e); ++ printf (" "); ++ ++ printf ("range %" PRIx64 ", %" PRIx64 "\n", begin, end); ++ if (! print_unresolved_addresses) ++ { ++ char *b = format_dwarf_addr (dwflmod, address_size, base + begin, ++ base + begin); ++ char *e = format_dwarf_addr (dwflmod, address_size, ++ base + end - 1, base + end); ++ printf (" %s..\n", b); ++ printf (" %s\n", e); ++ free (b); ++ free (e); ++ } + + first = false; + } +diff --git a/tests/run-readelf-loc.sh b/tests/run-readelf-loc.sh +index 3959d3d..4b666cf 100755 +--- a/tests/run-readelf-loc.sh ++++ b/tests/run-readelf-loc.sh +@@ -68,10 +68,22 @@ DWARF section [33] '.debug_loc' at offset 0xd2a: + [ 46] 0x00000000004004b2 ..0x00000000004004ba [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: +- [ 0] 0x0000000000400480
..0x0000000000400482 +- 0x0000000000400485 ..0x000000000040048d +- [ 30] 0x00000000004004ad ..0x00000000004004af +- 0x00000000004004b2 ..0x00000000004004ba ++ ++ CU [ b] base: 0x0000000000400480
++ [ 0] range 0, 2 ++ 0x0000000000400480
.. ++ 0x0000000000400481 ++ range 5, d ++ 0x0000000000400485 .. ++ 0x000000000040048c ++ ++ CU [ e0] base: 0x00000000004004a0 ++ [ 30] range d, f ++ 0x00000000004004ad .. ++ 0x00000000004004ae ++ range 12, 1a ++ 0x00000000004004b2 .. ++ 0x00000000004004b9 + EOF + + # Don't resolve addresses to symbols. +@@ -84,10 +96,22 @@ DWARF section [33] '.debug_loc' at offset 0xd2a: + [ 46] 0x00000000004004b2..0x00000000004004ba [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: +- [ 0] 0x0000000000400480..0x0000000000400482 +- 0x0000000000400485..0x000000000040048d +- [ 30] 0x00000000004004ad..0x00000000004004af +- 0x00000000004004b2..0x00000000004004ba ++ ++ CU [ b] base: 0x0000000000400480 ++ [ 0] range 0, 2 ++ 0x0000000000400480.. ++ 0x0000000000400481 ++ range 5, d ++ 0x0000000000400485.. ++ 0x000000000040048c ++ ++ CU [ e0] base: 0x00000000004004a0 ++ [ 30] range d, f ++ 0x00000000004004ad.. ++ 0x00000000004004ae ++ range 12, 1a ++ 0x00000000004004b2.. ++ 0x00000000004004b9 + EOF + + # Produce "raw" unprocessed content. +@@ -100,10 +124,14 @@ DWARF section [33] '.debug_loc' at offset 0xd2a: + [ 46] 0x0000000000000012..0x000000000000001a [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: +- [ 0] 000000000000000000..0x0000000000000002 +- 0x0000000000000005..0x000000000000000d +- [ 30] 0x000000000000000d..0x000000000000000f +- 0x0000000000000012..0x000000000000001a ++ ++ CU [ b] base: 0x0000000000400480 ++ [ 0] range 0, 2 ++ range 5, d ++ ++ CU [ e0] base: 0x00000000004004a0 ++ [ 30] range d, f ++ range 12, 1a + EOF + + exit 0 +diff --git a/tests/run-readelf-zdebug.sh b/tests/run-readelf-zdebug.sh +index fc666fd..7be9bee 100755 +--- a/tests/run-readelf-zdebug.sh ++++ b/tests/run-readelf-zdebug.sh +@@ -80,7 +80,9 @@ cat aranges.out | sed -e "s/.debug_aranges' at offset 0xa65/.zdebug_aranges' at + cat > ranges.out << \EOF + + DWARF section [32] '.debug_ranges' at offset 0xa95: +- [ 0] 0x00000000004003c0..0x00000000004003d9 ++ ++ CU [ b] base: 000000000000000000 ++ [ 0] range 4003c0, 4003d9 + EOF + + cat ranges.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=ranges testfile-debug + +commit fbb6c932e3ff74d4fb8bc54b72d9c9bdc4513f69 +Author: Mark Wielaard +Date: Wed Nov 29 16:37:50 2017 +0100 + + readelf: Print CU, base address and unresolved .debug_loc entries. + + Also adjust the formatting for the resolved addresses to print them + on separate lines so they nicely line up even when the addresses are + resolved to symbol+offset names. And print the operands starting on + a new line. + + Signed-off-by: Mark Wielaard + +diff --git a/src/readelf.c b/src/readelf.c +index 8e13462..bb48af9 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -7130,19 +7130,36 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + uint_fast8_t offset_size = 4; + + bool first = true; +- struct Dwarf_CU *cu = NULL; + Dwarf_Addr base = 0; + unsigned char *readp = data->d_buf; + unsigned char *const endp = (unsigned char *) data->d_buf + data->d_size; ++ Dwarf_CU *last_cu = NULL; + while (readp < endp) + { + ptrdiff_t offset = readp - (unsigned char *) data->d_buf; ++ Dwarf_CU *cu; + + if (first && skip_listptr_hole (&known_loclistptr, &listptr_idx, + &address_size, &offset_size, &base, + &cu, offset, &readp, endp)) + continue; + ++ if (last_cu != cu) ++ { ++ char *basestr = format_dwarf_addr (dwflmod, address_size, ++ base, base); ++ Dwarf_Die cudie; ++ if (dwarf_cu_die (cu, &cudie, ++ NULL, NULL, NULL, NULL, ++ NULL, NULL) == NULL) ++ printf (gettext ("\n Unknown CU base: %s\n"), basestr); ++ else ++ printf (gettext ("\n CU [%6" PRIx64 "] base: %s\n"), ++ dwarf_dieoffset (&cudie), basestr); ++ free (basestr); ++ } ++ last_cu = cu; ++ + if (unlikely (data->d_size - offset < (size_t) address_size * 2)) + { + printf (gettext (" [%6tx] \n"), offset); +@@ -7167,14 +7184,14 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + if (begin == (Dwarf_Addr) -1l) /* Base address entry. */ + { + char *b = format_dwarf_addr (dwflmod, address_size, end, end); +- printf (gettext (" [%6tx] base address %s\n"), offset, b); ++ printf (gettext (" [%6tx] base address\n %s\n"), offset, b); + free (b); + base = end; + } + else if (begin == 0 && end == 0) /* End of list entry. */ + { + if (first) +- printf (gettext (" [%6tx] empty list\n"), offset); ++ printf (gettext (" [%6tx] empty list\n"), offset); + first = true; + } + else +@@ -7182,18 +7199,23 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + /* We have a location expression entry. */ + uint_fast16_t len = read_2ubyte_unaligned_inc (dbg, readp); + +- char *b = format_dwarf_addr (dwflmod, address_size, base + begin, +- begin); +- char *e = format_dwarf_addr (dwflmod, address_size, base + end, +- end); +- + if (first) /* First entry in a list. */ +- printf (gettext (" [%6tx] %s..%s"), offset, b, e); ++ printf (" [%6tx] ", offset); + else +- printf (gettext (" %s..%s"), b, e); ++ printf (" "); + +- free (b); +- free (e); ++ printf ("range %" PRIx64 ", %" PRIx64 "\n", begin, end); ++ if (! print_unresolved_addresses) ++ { ++ char *b = format_dwarf_addr (dwflmod, address_size, base + begin, ++ base + begin); ++ char *e = format_dwarf_addr (dwflmod, address_size, ++ base + end - 1, base + end); ++ printf (" %s..\n", b); ++ printf (" %s\n", e); ++ free (b); ++ free (e); ++ } + + if (endp - readp <= (ptrdiff_t) len) + { +@@ -7201,8 +7223,9 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + break; + } + +- print_ops (dwflmod, dbg, 1, 18 + (address_size * 4), +- 3 /*XXX*/, address_size, offset_size, cu, len, readp); ++ print_ops (dwflmod, dbg, 11, 11, ++ cu != NULL ? cu->version : 3, ++ address_size, offset_size, cu, len, readp); + + first = false; + readp += len; +diff --git a/tests/run-readelf-loc.sh b/tests/run-readelf-loc.sh +index 4b666cf..e5152df 100755 +--- a/tests/run-readelf-loc.sh ++++ b/tests/run-readelf-loc.sh +@@ -63,9 +63,22 @@ testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=loc --debug-dump=ra + testfileloc<<\EOF + + DWARF section [33] '.debug_loc' at offset 0xd2a: +- [ 0] 0x0000000000400480
..0x000000000040048d [ 0] reg5 +- [ 23] 0x0000000000400485 ..0x000000000040048d [ 0] reg5 +- [ 46] 0x00000000004004b2 ..0x00000000004004ba [ 0] breg5 0 ++ ++ CU [ b] base: 0x0000000000400480
++ [ 0] range 0, d ++ 0x0000000000400480
.. ++ 0x000000000040048c ++ [ 0] reg5 ++ [ 23] range 5, d ++ 0x0000000000400485 .. ++ 0x000000000040048c ++ [ 0] reg5 ++ ++ CU [ e0] base: 0x00000000004004a0 ++ [ 46] range 12, 1a ++ 0x00000000004004b2 .. ++ 0x00000000004004b9 ++ [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: + +@@ -91,9 +104,22 @@ testrun_compare ${abs_top_builddir}/src/readelf -N --debug-dump=loc --debug-dump + testfileloc<<\EOF + + DWARF section [33] '.debug_loc' at offset 0xd2a: +- [ 0] 0x0000000000400480..0x000000000040048d [ 0] reg5 +- [ 23] 0x0000000000400485..0x000000000040048d [ 0] reg5 +- [ 46] 0x00000000004004b2..0x00000000004004ba [ 0] breg5 0 ++ ++ CU [ b] base: 0x0000000000400480 ++ [ 0] range 0, d ++ 0x0000000000400480.. ++ 0x000000000040048c ++ [ 0] reg5 ++ [ 23] range 5, d ++ 0x0000000000400485.. ++ 0x000000000040048c ++ [ 0] reg5 ++ ++ CU [ e0] base: 0x00000000004004a0 ++ [ 46] range 12, 1a ++ 0x00000000004004b2.. ++ 0x00000000004004b9 ++ [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: + +@@ -119,9 +145,16 @@ testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc --debug-dump + testfileloc<<\EOF + + DWARF section [33] '.debug_loc' at offset 0xd2a: +- [ 0] 000000000000000000..0x000000000000000d [ 0] reg5 +- [ 23] 0x0000000000000005..0x000000000000000d [ 0] reg5 +- [ 46] 0x0000000000000012..0x000000000000001a [ 0] breg5 0 ++ ++ CU [ b] base: 0x0000000000400480 ++ [ 0] range 0, d ++ [ 0] reg5 ++ [ 23] range 5, d ++ [ 0] reg5 ++ ++ CU [ e0] base: 0x00000000004004a0 ++ [ 46] range 12, 1a ++ [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: + +diff --git a/tests/run-readelf-zdebug-rel.sh b/tests/run-readelf-zdebug-rel.sh +index 2b57d05..ccccd82 100755 +--- a/tests/run-readelf-zdebug-rel.sh ++++ b/tests/run-readelf-zdebug-rel.sh +@@ -127,12 +127,17 @@ cat info.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=i + cat > loc.out << \EOF + + DWARF section [ 7] '.debug_loc' at offset 0x185: +- [ 0] 000000000000000000..0x0000000000000003 [ 0] reg5 +- 0x0000000000000003..0x0000000000000010 [ 0] breg5 -42 +- [ 2] stack_value +- 0x0000000000000010..0x0000000000000018 [ 0] GNU_entry_value: +- [ 0] reg5 +- [ 3] stack_value ++ ++ CU [ b] base: 000000000000000000 ++ [ 0] range 0, 3 ++ [ 0] reg5 ++ range 3, 10 ++ [ 0] breg5 -42 ++ [ 2] stack_value ++ range 10, 18 ++ [ 0] GNU_entry_value: ++ [ 0] reg5 ++ [ 3] stack_value + EOF + + cat loc.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug-rel.o +diff --git a/tests/run-readelf-zdebug.sh b/tests/run-readelf-zdebug.sh +index 7be9bee..28128ad 100755 +--- a/tests/run-readelf-zdebug.sh ++++ b/tests/run-readelf-zdebug.sh +@@ -46,12 +46,17 @@ tempfiles loc.out aranges.out ranges.out macro.out line.out frame.out + cat > loc.out << \EOF + + DWARF section [30] '.debug_loc' at offset 0xa17: +- [ 0] 0x00000000004003c0..0x00000000004003c3 [ 0] reg5 +- 0x00000000004003c3..0x00000000004003d6 [ 0] breg5 -42 +- [ 2] stack_value +- 0x00000000004003d6..0x00000000004003d9 [ 0] GNU_entry_value: +- [ 0] reg5 +- [ 3] stack_value ++ ++ CU [ b] base: 000000000000000000 ++ [ 0] range 4003c0, 4003c3 ++ [ 0] reg5 ++ range 4003c3, 4003d6 ++ [ 0] breg5 -42 ++ [ 2] stack_value ++ range 4003d6, 4003d9 ++ [ 0] GNU_entry_value: ++ [ 0] reg5 ++ [ 3] stack_value + EOF + + cat loc.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug + +commit e98f032d293a8ea8ea2b25949d7f452603e644d9 +Author: Mark Wielaard +Date: Thu Jan 25 13:24:19 2018 +0100 + + readelf: Fix crash on reading loc data or range data with bad/no CUs. + + In print_debug_ranges_section and print_debug_loc_section we try to + get the associated CU through skip_listptr_hole for the first data data. + If no CU at all can be found (because the .debug_info section was bogus) + this would keep the Dwarf_CU uninitialized causing a crash later on + when it was compared to the last_cu and used because it was unequal. + Fix this by explicitly initializing cu to last_cu (which is NULL on + first use). + + Signed-off-by: Mark Wielaard + +diff --git a/src/readelf.c b/src/readelf.c +index 4bdaef2..6c49d30 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -5014,7 +5014,7 @@ print_debug_ranges_section (Dwfl_Module *dwflmod, + while (readp < endp) + { + ptrdiff_t offset = readp - (unsigned char *) data->d_buf; +- Dwarf_CU *cu; ++ Dwarf_CU *cu = last_cu; + + if (first && skip_listptr_hole (&known_rangelistptr, &listptr_idx, + &address_size, NULL, &base, &cu, +@@ -7140,7 +7140,7 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + while (readp < endp) + { + ptrdiff_t offset = readp - (unsigned char *) data->d_buf; +- Dwarf_CU *cu; ++ Dwarf_CU *cu = last_cu; + + if (first && skip_listptr_hole (&known_loclistptr, &listptr_idx, + &address_size, &offset_size, &base, + +commit 0f1d3389f18887ff4ef411812e95deab3e8dfb7c +Author: Mark Wielaard +Date: Thu Mar 1 00:14:52 2018 +0100 + + readelf: Add some support for locviews. + + This adds minimal support for locviews as output by GCC8. + It changes readelf to keep track of loclistptrs from DW_AT_GNU_locviews + and prints the locview pairs for those. Since there is no terminator + we have to keep track of where the next loclist entry starts. + The --debug-dump=loc output looks as follows: + + CU [ 714] base: +0x0000000000003020 + [ b4] view pair 1, 2 + [ b6] range 4, 7f + +0x0000000000003024 .. + +0x000000000000309e + [ 0] reg5 + [ d9] view pair 3, 1 + view pair 1, 2 + [ dd] range 4, 4c + +0x0000000000003024 .. + +0x000000000000306b + [ 0] reg5 + range 4c, 7f + +0x000000000000306c .. + +0x000000000000309e + [ 0] reg2 + + Note that in the above output the view pairs correspond to the ranges + immediately following in the loc list. This is how GCC8 currently + outputs the locview pairs and ranges, but this is not guaranteed and + you'll need to look at the location and GNU_locviews attributes of the + DIE to know which really match up together. We might want to adjust the + output to make this more clear. + + This does not yet add an locview accessor to libdw. It just recognizes + the DW_AT_GNU_locviews attribute as a loclistptr when encoded as a + sec_offset form. + + Signed-off-by: Mark Wielaard + +diff --git a/libdw/dwarf.h b/libdw/dwarf.h +index 4f36206..d53a30d 100644 +--- a/libdw/dwarf.h ++++ b/libdw/dwarf.h +@@ -339,6 +339,8 @@ enum + DW_AT_GNU_all_tail_call_sites = 0x2116, + DW_AT_GNU_all_call_sites = 0x2117, + DW_AT_GNU_all_source_call_sites = 0x2118, ++ DW_AT_GNU_locviews = 0x2137, ++ DW_AT_GNU_entry_view = 0x2138, + DW_AT_GNU_macros = 0x2119, + DW_AT_GNU_deleted = 0x211a, + +diff --git a/libdw/dwarf_formudata.c b/libdw/dwarf_formudata.c +index 9c1644e..95872d6 100644 +--- a/libdw/dwarf_formudata.c ++++ b/libdw/dwarf_formudata.c +@@ -141,6 +141,7 @@ dwarf_formudata (Dwarf_Attribute *attr, Dwarf_Word *return_uval) + case DW_AT_string_length: + case DW_AT_use_location: + case DW_AT_vtable_elem_location: ++ case DW_AT_GNU_locviews: + /* loclistptr */ + if (__libdw_formptr (attr, IDX_debug_loc, + DWARF_E_NO_LOCLIST, NULL, +diff --git a/src/readelf.c b/src/readelf.c +index 2d49af3..098209f 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -4532,6 +4532,7 @@ struct listptr + bool dwarf64:1; + bool warned:1; + struct Dwarf_CU *cu; ++ unsigned int attr; + }; + + #define listptr_offset_size(p) ((p)->dwarf64 ? 8 : 4) +@@ -4592,6 +4593,15 @@ compare_listptr (const void *a, const void *b, void *arg) + gettext ("%s %#" PRIx64 " used with different base addresses"), + name, (uint64_t) p1->offset); + } ++ if (p1->attr != p2 ->attr) ++ { ++ p1->warned = p2->warned = true; ++ error (0, 0, ++ gettext ("%s %#" PRIx64 ++ " used with different attribute %s and %s"), ++ name, (uint64_t) p1->offset, dwarf_attr_name (p2->attr), ++ dwarf_attr_name (p2->attr)); ++ } + } + + return 0; +@@ -4619,7 +4629,7 @@ reset_listptr (struct listptr_table *table) + static bool + notice_listptr (enum section_e section, struct listptr_table *table, + uint_fast8_t address_size, uint_fast8_t offset_size, +- struct Dwarf_CU *cu, Dwarf_Off offset) ++ struct Dwarf_CU *cu, Dwarf_Off offset, unsigned int attr) + { + if (print_debug_sections & section) + { +@@ -4640,7 +4650,8 @@ notice_listptr (enum section_e section, struct listptr_table *table, + .addr64 = address_size == 8, + .dwarf64 = offset_size == 8, + .offset = offset, +- .cu = cu ++ .cu = cu, ++ .attr = attr + }; + + if (p->offset != offset) +@@ -4664,7 +4675,8 @@ static bool + skip_listptr_hole (struct listptr_table *table, size_t *idxp, + uint_fast8_t *address_sizep, uint_fast8_t *offset_sizep, + Dwarf_Addr *base, struct Dwarf_CU **cu, ptrdiff_t offset, +- unsigned char **readp, unsigned char *endp) ++ unsigned char **readp, unsigned char *endp, ++ unsigned int *attr) + { + if (table->n == 0) + return false; +@@ -4699,10 +4711,27 @@ skip_listptr_hole (struct listptr_table *table, size_t *idxp, + *base = listptr_base (p); + if (cu != NULL) + *cu = p->cu; ++ if (attr != NULL) ++ *attr = p->attr; + + return false; + } + ++static Dwarf_Off ++next_listptr_offset (struct listptr_table *table, size_t idx) ++{ ++ /* Note that multiple attributes could in theory point to the same loclist ++ offset, so make sure we pick one that is bigger than the current one. ++ The table is sorted on offset. */ ++ Dwarf_Off offset = table->table[idx].offset; ++ while (++idx < table->n) ++ { ++ Dwarf_Off next = table->table[idx].offset; ++ if (next > offset) ++ return next; ++ } ++ return 0; ++} + + static void + print_debug_abbrev_section (Dwfl_Module *dwflmod __attribute__ ((unused)), +@@ -5042,7 +5071,7 @@ print_debug_ranges_section (Dwfl_Module *dwflmod, + + if (first && skip_listptr_hole (&known_rangelistptr, &listptr_idx, + &address_size, NULL, &base, &cu, +- offset, &readp, endp)) ++ offset, &readp, endp, NULL)) + continue; + + if (last_cu != cu) +@@ -6121,10 +6150,11 @@ 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: ++ case DW_AT_GNU_locviews: + { + bool nlpt = notice_listptr (section_loc, &known_loclistptr, + cbargs->addrsize, cbargs->offset_size, +- cbargs->cu, num); ++ cbargs->cu, num, attr); + if (!cbargs->silent) + printf (" %*s%-20s (%s) location list [%6" PRIxMAX "]%s\n", + (int) (level * 2), "", dwarf_attr_name (attr), +@@ -6137,7 +6167,7 @@ attr_callback (Dwarf_Attribute *attrp, void *arg) + { + bool nlpt = notice_listptr (section_ranges, &known_rangelistptr, + cbargs->addrsize, cbargs->offset_size, +- cbargs->cu, num); ++ cbargs->cu, num, attr); + if (!cbargs->silent) + printf (" %*s%-20s (%s) range list [%6" PRIxMAX "]%s\n", + (int) (level * 2), "", dwarf_attr_name (attr), +@@ -7215,10 +7245,11 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + { + ptrdiff_t offset = readp - (unsigned char *) data->d_buf; + Dwarf_CU *cu = last_cu; ++ unsigned int attr = 0; + + if (first && skip_listptr_hole (&known_loclistptr, &listptr_idx, + &address_size, &offset_size, &base, +- &cu, offset, &readp, endp)) ++ &cu, offset, &readp, endp, &attr)) + continue; + + if (last_cu != cu) +@@ -7237,6 +7268,40 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + } + last_cu = cu; + ++ if (attr == DW_AT_GNU_locviews) ++ { ++ Dwarf_Off next_off = next_listptr_offset (&known_loclistptr, ++ listptr_idx); ++ const unsigned char *locp = readp; ++ const unsigned char *locendp; ++ if (next_off == 0) ++ locendp = endp; ++ else ++ locendp = (const unsigned char *) data->d_buf + next_off; ++ ++ while (locp < locendp) ++ { ++ uint64_t v1, v2; ++ get_uleb128 (v1, locp, locendp); ++ if (locp >= locendp) ++ { ++ printf (gettext (" [%6tx] \n"), offset); ++ break; ++ } ++ get_uleb128 (v2, locp, locendp); ++ if (first) /* First view pair in a list. */ ++ printf (" [%6tx] ", offset); ++ else ++ printf (" "); ++ printf ("view pair %" PRId64 ", %" PRId64 "\n", v1, v2); ++ first = false; ++ } ++ ++ first = true; ++ readp = (unsigned char *) locendp; ++ continue; ++ } ++ + if (unlikely (data->d_size - offset < (size_t) address_size * 2)) + { + printf (gettext (" [%6tx] \n"), offset); diff --git a/elfutils.spec b/elfutils.spec index 398df3c..0576fe8 100644 --- a/elfutils.spec +++ b/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 7 +%global baserelease 10 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -28,6 +28,7 @@ Patch4: elfutils-0.170-core-pid.patch Patch5: elfutils-0.170-elf_sync.patch Patch6: elfutils-0.170-new-notes-hack.patch Patch7: elfutils-0.170-GNU_variable_value.patch +Patch8: elfutils-0.170-locviews.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -187,6 +188,7 @@ cp %SOURCE1 tests/ %patch5 -p1 -b .elf_sync %patch6 -p1 -b .notes_hack %patch7 -p1 -b .variable_value +%patch8 -p1 -b .locviews find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -322,8 +324,9 @@ fi %endif %changelog -* Thu Mar 01 2018 Mark Wielaard +* Thu Mar 01 2018 Mark Wielaard - 0.170-10 - Add elfutils-0.170-GNU_variable_value.patch +- Add elfutils-0.170-locviews.patch * Fri Feb 16 2018 Mark Wielaard - 0.170-9 - Add elfutils-0.170-core-pid.patch