xref: /OK3568_Linux_fs/yocto/poky/meta/recipes-devtools/binutils/binutils/0017-CVE-2022-38127-1.patch (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1From 19c26da69d68d5d863f37c06ad73ab6292d02ffa Mon Sep 17 00:00:00 2001
2From: Nick Clifton <nickc@redhat.com>
3Date: Wed, 6 Apr 2022 14:43:37 +0100
4Subject: [PATCH] Add code to display the contents of .debug_loclists sections
5 which contain offset entry tables.
6
7	PR 28981
8	* dwarf.c (fetch_indexed_value): Rename to fecth_indexed_addr and
9	return the address, rather than a string.
10	(fetch_indexed_value): New function - returns a value indexed by a
11	DW_FORM_loclistx or DW_FORM_rnglistx form.
12	(read_and_display_attr_value): Add support for DW_FORM_loclistx
13	and DW_FORM_rnglistx.
14	(process_debug_info): Load the loclists and rnglists sections.
15	(display_loclists_list): Add support for DW_LLE_base_addressx,
16	DW_LLE_startx_endx, DW_LLE_startx_length and
17	DW_LLE_default_location.
18	(display_offset_entry_loclists): New function.  Displays a
19	.debug_loclists section that contains offset entry tables.
20	(display_debug_loc): Call the new function.
21	(display_debug_rnglists_list): Add support for
22	DW_RLE_base_addressx, DW_RLE_startx_endx and DW_RLE_startx_length.
23	(display_debug_ranges): Display the contents of the section's
24	header.
25	* dwarf.h (struct debug_info): Add loclists_base field.
26	* testsuite/binutils-all/dw5.W: Update expected output.
27	* testsuite/binutils-all/x86-64/pr26808.dump: Likewise.
28
29Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=19c26da69d68d5d863f37c06ad73ab6292d02ffa]
30
31Signed-off-by: Pgowda <pgowda.cve@gmail.com>
32---
33 binutils/ChangeLog                            |  24 +
34 binutils/dwarf.c                              | 513 +++++++++++++++---
35 binutils/dwarf.h                              |   4 +
36 binutils/testsuite/binutils-all/dw5.W         |   2 +-
37 .../binutils-all/x86-64/pr26808.dump          |  82 +--
38 gas/ChangeLog                                 |   5 +
39 gas/testsuite/gas/elf/dwarf-5-irp.d           |   2 +-
40 7 files changed, 517 insertions(+), 115 deletions(-)
41
42diff --git a/binutils/dwarf.c b/binutils/dwarf.c
43index 15b3c81a138..bc862f77c04 100644
44--- a/binutils/dwarf.c
45+++ b/binutils/dwarf.c
46@@ -240,7 +240,7 @@ static const char *
47 dwarf_vmatoa_1 (const char *fmtch, dwarf_vma value, unsigned num_bytes)
48 {
49   /* As dwarf_vmatoa is used more then once in a printf call
50-     for output, we are cycling through an fixed array of pointers
51+     for output, we are cycling through a fixed array of pointers
52      for return address.  */
53   static int buf_pos = 0;
54   static struct dwarf_vmatoa_buf
55@@ -796,24 +796,70 @@ fetch_indexed_string (dwarf_vma idx, str
56   return ret;
57 }
58
59-static const char *
60-fetch_indexed_value (dwarf_vma offset, dwarf_vma bytes)
61+static dwarf_vma
62+fetch_indexed_addr (dwarf_vma offset, uint32_t num_bytes)
63 {
64   struct dwarf_section *section = &debug_displays [debug_addr].section;
65
66   if (section->start == NULL)
67-    return (_("<no .debug_addr section>"));
68+    {
69+      warn (_("<no .debug_addr section>"));
70+      return 0;
71+    }
72
73-  if (offset + bytes > section->size)
74+  if (offset + num_bytes > section->size)
75     {
76       warn (_("Offset into section %s too big: 0x%s\n"),
77 	    section->name, dwarf_vmatoa ("x", offset));
78-      return "<offset too big>";
79+      return 0;
80     }
81
82-  return dwarf_vmatoa ("x", byte_get (section->start + offset, bytes));
83+  return byte_get (section->start + offset, num_bytes);
84 }
85
86+/* Fetch a value from a debug section that has been indexed by
87+   something in another section (eg DW_FORM_loclistx).
88+   Returns 0 if the value could not be found.  */
89+
90+static dwarf_vma
91+fetch_indexed_value (dwarf_vma                        index,
92+		     enum dwarf_section_display_enum  sec_enum)
93+{
94+  struct dwarf_section *section = &debug_displays [sec_enum].section;
95+
96+  if (section->start == NULL)
97+    {
98+      warn (_("Unable to locate %s section\n"), section->uncompressed_name);
99+      return 0;
100+    }
101+
102+  uint32_t pointer_size, bias;
103+
104+  if (byte_get (section->start, 4) == 0xffffffff)
105+    {
106+      pointer_size = 8;
107+      bias = 20;
108+    }
109+  else
110+    {
111+      pointer_size = 4;
112+      bias = 12;
113+    }
114+
115+  dwarf_vma offset = index * pointer_size;
116+
117+  /* Offsets are biased by the size of the section header.  */
118+  offset += bias;
119+
120+  if (offset + pointer_size > section->size)
121+    {
122+      warn (_("Offset into section %s too big: 0x%s\n"),
123+	    section->name, dwarf_vmatoa ("x", offset));
124+      return 0;
125+    }
126+
127+  return byte_get (section->start + offset, pointer_size);
128+}
129
130 /* FIXME:  There are better and more efficient ways to handle
131    these structures.  For now though, I just want something that
132@@ -1999,6 +2045,8 @@ skip_attr_bytes (unsigned long form,
133     case DW_FORM_strx:
134     case DW_FORM_GNU_addr_index:
135     case DW_FORM_addrx:
136+    case DW_FORM_loclistx:
137+    case DW_FORM_rnglistx:
138       READ_ULEB (uvalue, data, end);
139       break;
140
141@@ -2410,9 +2458,6 @@ read_and_display_attr_value (unsigned lo
142
143   switch (form)
144     {
145-    default:
146-      break;
147-
148     case DW_FORM_ref_addr:
149       if (dwarf_version == 2)
150 	SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end);
151@@ -2496,6 +2541,8 @@ read_and_display_attr_value (unsigned lo
152     case DW_FORM_udata:
153     case DW_FORM_GNU_addr_index:
154     case DW_FORM_addrx:
155+    case DW_FORM_loclistx:
156+    case DW_FORM_rnglistx:
157       READ_ULEB (uvalue, data, end);
158       break;
159
160@@ -2515,6 +2562,9 @@ read_and_display_attr_value (unsigned lo
161     case DW_FORM_implicit_const:
162       uvalue = implicit_const;
163       break;
164+
165+    default:
166+      break;
167     }
168
169   switch (form)
170@@ -2710,6 +2760,8 @@ read_and_display_attr_value (unsigned lo
171     case DW_FORM_addrx2:
172     case DW_FORM_addrx3:
173     case DW_FORM_addrx4:
174+    case DW_FORM_loclistx:
175+    case DW_FORM_rnglistx:
176       if (!do_loc)
177 	{
178 	  dwarf_vma base;
179@@ -2728,11 +2780,11 @@ read_and_display_attr_value (unsigned lo
180 	    /* We have already displayed the form name.  */
181 	    printf (_("%c(index: 0x%s): %s"), delimiter,
182 		    dwarf_vmatoa ("x", uvalue),
183-		    fetch_indexed_value (offset, pointer_size));
184+		    dwarf_vmatoa ("x", fetch_indexed_addr (offset, pointer_size)));
185 	  else
186 	    printf (_("%c(addr_index: 0x%s): %s"), delimiter,
187 		    dwarf_vmatoa ("x", uvalue),
188-		    fetch_indexed_value (offset, pointer_size));
189+		    dwarf_vmatoa ("x", fetch_indexed_addr (offset, pointer_size)));
190 	}
191       break;
192
193@@ -2754,6 +2806,13 @@ read_and_display_attr_value (unsigned lo
194     {
195       switch (attribute)
196 	{
197+	case DW_AT_loclists_base:
198+	  if (debug_info_p->loclists_base)
199+	    warn (_("CU @ 0x%s has multiple loclists_base values"),
200+		  dwarf_vmatoa ("x", debug_info_p->cu_offset));
201+	  debug_info_p->loclists_base = uvalue;
202+	  break;
203+
204 	case DW_AT_frame_base:
205 	  have_frame_base = 1;
206 	  /* Fall through.  */
207@@ -2776,7 +2835,8 @@ read_and_display_attr_value (unsigned lo
208 	case DW_AT_GNU_call_site_target_clobbered:
209 	  if ((dwarf_version < 4
210 	       && (form == DW_FORM_data4 || form == DW_FORM_data8))
211-	      || form == DW_FORM_sec_offset)
212+	      || form == DW_FORM_sec_offset
213+	      || form == DW_FORM_loclistx)
214 	    {
215 	      /* Process location list.  */
216 	      unsigned int lmax = debug_info_p->max_loc_offsets;
217@@ -2796,11 +2856,17 @@ read_and_display_attr_value (unsigned lo
218 			       lmax, sizeof (*debug_info_p->have_frame_base));
219 		  debug_info_p->max_loc_offsets = lmax;
220 		}
221-	      if (this_set != NULL)
222+
223+	      if (form == DW_FORM_loclistx)
224+		uvalue = fetch_indexed_value (uvalue, loclists);
225+	      else if (this_set != NULL)
226 		uvalue += this_set->section_offsets [DW_SECT_LOC];
227+
228 	      debug_info_p->have_frame_base [num] = have_frame_base;
229 	      if (attribute != DW_AT_GNU_locviews)
230 		{
231+		  uvalue += debug_info_p->loclists_base;
232+
233 		  /* Corrupt DWARF info can produce more offsets than views.
234 		     See PR 23062 for an example.  */
235 		  if (debug_info_p->num_loc_offsets
236@@ -2844,7 +2910,8 @@ read_and_display_attr_value (unsigned lo
237 	case DW_AT_ranges:
238 	  if ((dwarf_version < 4
239 	       && (form == DW_FORM_data4 || form == DW_FORM_data8))
240-	      || form == DW_FORM_sec_offset)
241+	      || form == DW_FORM_sec_offset
242+	      || form == DW_FORM_rnglistx)
243 	    {
244 	      /* Process range list.  */
245 	      unsigned int lmax = debug_info_p->max_range_lists;
246@@ -2858,6 +2925,10 @@ read_and_display_attr_value (unsigned lo
247 			       lmax, sizeof (*debug_info_p->range_lists));
248 		  debug_info_p->max_range_lists = lmax;
249 		}
250+
251+	      if (form == DW_FORM_rnglistx)
252+		uvalue = fetch_indexed_value (uvalue, rnglists);
253+
254 	      debug_info_p->range_lists [num] = uvalue;
255 	      debug_info_p->num_range_lists++;
256 	    }
257@@ -3231,6 +3302,7 @@ read_and_display_attr_value (unsigned lo
258       have_frame_base = 1;
259       /* Fall through.  */
260     case DW_AT_location:
261+    case DW_AT_loclists_base:
262     case DW_AT_string_length:
263     case DW_AT_return_addr:
264     case DW_AT_data_member_location:
265@@ -3248,7 +3320,8 @@ read_and_display_attr_value (unsigned lo
266     case DW_AT_GNU_call_site_target_clobbered:
267       if ((dwarf_version < 4
268 	   && (form == DW_FORM_data4 || form == DW_FORM_data8))
269-	  || form == DW_FORM_sec_offset)
270+	  || form == DW_FORM_sec_offset
271+	  || form == DW_FORM_loclistx)
272 	printf (_(" (location list)"));
273       /* Fall through.  */
274     case DW_AT_allocated:
275@@ -3517,6 +3590,9 @@ process_debug_info (struct dwarf_section
276     }
277
278   load_debug_section_with_follow (abbrev_sec, file);
279+  load_debug_section_with_follow (loclists, file);
280+  load_debug_section_with_follow (rnglists, file);
281+
282   if (debug_displays [abbrev_sec].section.start == NULL)
283     {
284       warn (_("Unable to locate %s section!\n"),
285@@ -3729,6 +3805,7 @@ process_debug_info (struct dwarf_section
286 	  debug_information [unit].have_frame_base = NULL;
287 	  debug_information [unit].max_loc_offsets = 0;
288 	  debug_information [unit].num_loc_offsets = 0;
289+	  debug_information [unit].loclists_base = 0;
290 	  debug_information [unit].range_lists = NULL;
291 	  debug_information [unit].max_range_lists= 0;
292 	  debug_information [unit].num_range_lists = 0;
293@@ -6465,20 +6542,21 @@ display_loc_list (struct dwarf_section *
294 /* Display a location list from a normal (ie, non-dwo) .debug_loclists section.  */
295
296 static void
297-display_loclists_list (struct dwarf_section *section,
298-		       unsigned char **start_ptr,
299-		       unsigned int debug_info_entry,
300-		       dwarf_vma offset,
301-		       dwarf_vma base_address,
302-		       unsigned char **vstart_ptr,
303-		       int has_frame_base)
304-{
305-  unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
306-  unsigned char *section_end = section->start + section->size;
307-  dwarf_vma    cu_offset;
308-  unsigned int pointer_size;
309-  unsigned int offset_size;
310-  int dwarf_version;
311+display_loclists_list (struct dwarf_section *  section,
312+		       unsigned char **        start_ptr,
313+		       unsigned int            debug_info_entry,
314+		       dwarf_vma               offset,
315+		       dwarf_vma               base_address,
316+		       unsigned char **        vstart_ptr,
317+		       int                     has_frame_base)
318+{
319+  unsigned char *  start = *start_ptr;
320+  unsigned char *  vstart = *vstart_ptr;
321+  unsigned char *  section_end = section->start + section->size;
322+  dwarf_vma        cu_offset;
323+  unsigned int     pointer_size;
324+  unsigned int     offset_size;
325+  unsigned int     dwarf_version;
326
327   /* Initialize it due to a false compiler warning.  */
328   dwarf_vma begin = -1, vbegin = -1;
329@@ -6544,27 +6622,59 @@ display_loclists_list (struct dwarf_sect
330 	case DW_LLE_end_of_list:
331 	  printf (_("<End of list>\n"));
332 	  break;
333+
334+	case DW_LLE_base_addressx:
335+	  READ_ULEB (base_address, start, section_end);
336+	  print_dwarf_vma (base_address, pointer_size);
337+	  printf (_("(index into .debug_addr) "));
338+	  base_address = fetch_indexed_addr (base_address, pointer_size);
339+	  print_dwarf_vma (base_address, pointer_size);
340+	  printf (_("(base address)\n"));
341+	  break;
342+
343+	case DW_LLE_startx_endx:
344+	  READ_ULEB (begin, start, section_end);
345+	  begin = fetch_indexed_addr (begin, pointer_size);
346+	  READ_ULEB (end, start, section_end);
347+	  end = fetch_indexed_addr (end, pointer_size);
348+	  break;
349+
350+	case DW_LLE_startx_length:
351+	  READ_ULEB (begin, start, section_end);
352+	  begin = fetch_indexed_addr (begin, pointer_size);
353+	  READ_ULEB (end, start, section_end);
354+	  end += begin;
355+	  break;
356+
357+	case DW_LLE_default_location:
358+	  begin = end = 0;
359+	  break;
360+
361 	case DW_LLE_offset_pair:
362 	  READ_ULEB (begin, start, section_end);
363 	  begin += base_address;
364 	  READ_ULEB (end, start, section_end);
365 	  end += base_address;
366 	  break;
367+
368+	case DW_LLE_base_address:
369+	  SAFE_BYTE_GET_AND_INC (base_address, start, pointer_size,
370+				 section_end);
371+	  print_dwarf_vma (base_address, pointer_size);
372+	  printf (_("(base address)\n"));
373+	  break;
374+
375 	case DW_LLE_start_end:
376 	  SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
377 	  SAFE_BYTE_GET_AND_INC (end, start, pointer_size, section_end);
378 	  break;
379+
380 	case DW_LLE_start_length:
381 	  SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
382 	  READ_ULEB (end, start, section_end);
383 	  end += begin;
384 	  break;
385-	case DW_LLE_base_address:
386-	  SAFE_BYTE_GET_AND_INC (base_address, start, pointer_size,
387-				 section_end);
388-	  print_dwarf_vma (base_address, pointer_size);
389-	  printf (_("(base address)\n"));
390-	  break;
391+
392 #ifdef DW_LLE_view_pair
393 	case DW_LLE_view_pair:
394 	  if (vstart)
395@@ -6578,15 +6688,17 @@ display_loclists_list (struct dwarf_sect
396 	  printf (_("views for:\n"));
397 	  continue;
398 #endif
399+
400 	default:
401 	  error (_("Invalid location list entry type %d\n"), llet);
402 	  return;
403 	}
404+
405       if (llet == DW_LLE_end_of_list)
406 	break;
407-      if (llet != DW_LLE_offset_pair
408-	  && llet != DW_LLE_start_end
409-	  && llet != DW_LLE_start_length)
410+
411+      if (llet == DW_LLE_base_address
412+	  || llet == DW_LLE_base_addressx)
413 	continue;
414
415       if (start == section_end)
416@@ -6828,6 +6940,218 @@ loc_offsets_compar (const void *ap, cons
417 }
418
419 static int
420+display_offset_entry_loclists (struct dwarf_section *section)
421+{
422+  unsigned char *  start = section->start;
423+  unsigned char * const end = start + section->size;
424+
425+  introduce (section, false);
426+
427+  do
428+    {
429+      dwarf_vma        length;
430+      unsigned short   version;
431+      unsigned char    address_size;
432+      unsigned char    segment_selector_size;
433+      uint32_t         offset_entry_count;
434+      uint32_t         i;
435+      bool             is_64bit;
436+
437+      printf (_("Table at Offset 0x%lx\n"), (long)(start - section->start));
438+
439+      SAFE_BYTE_GET_AND_INC (length, start, 4, end);
440+      if (length == 0xffffffff)
441+	{
442+	  is_64bit = true;
443+	  SAFE_BYTE_GET_AND_INC (length, start, 8, end);
444+	}
445+      else
446+	is_64bit = false;
447+
448+      SAFE_BYTE_GET_AND_INC (version, start, 2, end);
449+      SAFE_BYTE_GET_AND_INC (address_size, start, 1, end);
450+      SAFE_BYTE_GET_AND_INC (segment_selector_size, start, 1, end);
451+      SAFE_BYTE_GET_AND_INC (offset_entry_count, start, 4, end);
452+
453+      printf (_("  Length:          0x%s\n"), dwarf_vmatoa ("x", length));
454+      printf (_("  DWARF version:   %u\n"), version);
455+      printf (_("  Address size:    %u\n"), address_size);
456+      printf (_("  Segment size:    %u\n"), segment_selector_size);
457+      printf (_("  Offset entries:  %u\n"), offset_entry_count);
458+
459+      if (version < 5)
460+	{
461+	  warn (_("The %s section contains a corrupt or "
462+		  "unsupported version number: %d.\n"),
463+		section->name, version);
464+	  return 0;
465+	}
466+
467+      if (segment_selector_size != 0)
468+	{
469+	  warn (_("The %s section contains an "
470+		  "unsupported segment selector size: %d.\n"),
471+		section->name, segment_selector_size);
472+	  return 0;
473+	}
474+
475+      if (offset_entry_count == 0)
476+	{
477+	  warn (_("The %s section contains a table without offset\n"),
478+		section->name);
479+	  return 0;
480+	}
481+
482+      printf (_("\n   Offset Entries starting at 0x%lx:\n"),
483+	      (long)(start - section->start));
484+
485+      if (is_64bit)
486+	{
487+	  for (i = 0; i < offset_entry_count; i++)
488+	    {
489+	      dwarf_vma entry;
490+
491+	      SAFE_BYTE_GET_AND_INC (entry, start, 8, end);
492+	      printf (_("    [%6u] 0x%s\n"), i, dwarf_vmatoa ("x", entry));
493+	    }
494+	}
495+      else
496+	{
497+	  for (i = 0; i < offset_entry_count; i++)
498+	    {
499+	      uint32_t entry;
500+
501+	      SAFE_BYTE_GET_AND_INC (entry, start, 4, end);
502+	      printf (_("    [%6u] 0x%x\n"), i, entry);
503+	    }
504+	}
505+
506+      putchar ('\n');
507+
508+      uint32_t j;
509+
510+      for (j = 1, i = 0; i < offset_entry_count;)
511+	{
512+	  unsigned char  lle;
513+	  dwarf_vma      base_address = 0;
514+	  dwarf_vma      begin;
515+	  dwarf_vma      finish;
516+	  dwarf_vma      off = start - section->start;
517+
518+	  if (j != i)
519+	    {
520+	      printf (_("   Offset Entry %u\n"), i);
521+	      j = i;
522+	    }
523+
524+	  printf ("    ");
525+	  print_dwarf_vma (off, 4);
526+
527+	  SAFE_BYTE_GET_AND_INC (lle, start, 1, end);
528+
529+	  switch (lle)
530+	    {
531+	    case DW_LLE_end_of_list:
532+	      printf (_("<End of list>\n\n"));
533+	      i ++;
534+	      continue;
535+
536+	    case DW_LLE_base_addressx:
537+	      READ_ULEB (base_address, start, end);
538+	      print_dwarf_vma (base_address, address_size);
539+	      printf (_("(index into .debug_addr) "));
540+	      base_address = fetch_indexed_addr (base_address, address_size);
541+	      print_dwarf_vma (base_address, address_size);
542+	      printf (_("(base address)\n"));
543+	      continue;
544+
545+	    case DW_LLE_startx_endx:
546+	      READ_ULEB (begin, start, end);
547+	      begin = fetch_indexed_addr (begin, address_size);
548+	      READ_ULEB (finish, start, end);
549+	      finish = fetch_indexed_addr (finish, address_size);
550+	      break;
551+
552+	    case DW_LLE_startx_length:
553+	      READ_ULEB (begin, start, end);
554+	      begin = fetch_indexed_addr (begin, address_size);
555+	      READ_ULEB (finish, start, end);
556+	      finish += begin;
557+	      break;
558+
559+	    case DW_LLE_offset_pair:
560+	      READ_ULEB (begin, start, end);
561+	      begin += base_address;
562+	      READ_ULEB (finish, start, end);
563+	      finish += base_address;
564+	      break;
565+
566+	    case DW_LLE_default_location:
567+	      begin = finish = 0;
568+	      break;
569+
570+	    case DW_LLE_base_address:
571+	      SAFE_BYTE_GET_AND_INC (base_address, start, address_size, end);
572+	      print_dwarf_vma (base_address, address_size);
573+	      printf (_("(base address)\n"));
574+	      continue;
575+
576+	    case DW_LLE_start_end:
577+	      SAFE_BYTE_GET_AND_INC (begin,  start, address_size, end);
578+	      SAFE_BYTE_GET_AND_INC (finish, start, address_size, end);
579+	      break;
580+
581+	    case DW_LLE_start_length:
582+	      SAFE_BYTE_GET_AND_INC (begin, start, address_size, end);
583+	      READ_ULEB (finish, start, end);
584+	      finish += begin;
585+	      break;
586+
587+	    default:
588+	      error (_("Invalid location list entry type %d\n"), lle);
589+	      return 0;
590+	    }
591+
592+	  if (start == end)
593+	    {
594+	      warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
595+		    (unsigned long) off);
596+	      break;
597+	    }
598+
599+	  print_dwarf_vma (begin, address_size);
600+	  print_dwarf_vma (finish, address_size);
601+
602+	  if (begin == finish)
603+	    fputs (_(" (start == end)"), stdout);
604+	  else if (begin > finish)
605+	    fputs (_(" (start > end)"), stdout);
606+
607+	  /* Read the counted location descriptions.  */
608+	  READ_ULEB (length, start, end);
609+
610+	  if (length > (size_t) (end - start))
611+	    {
612+	      warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
613+		    (unsigned long) off);
614+	      break;
615+	    }
616+
617+	  putchar (' ');
618+	  (void) decode_location_expression (start, address_size, address_size,
619+					     version, length, 0, section);
620+	  start += length;
621+	  putchar ('\n');
622+	}
623+
624+      putchar ('\n');
625+    }
626+  while (start < end);
627+
628+  return 1;
629+}
630+
631+static int
632 display_debug_loc (struct dwarf_section *section, void *file)
633 {
634   unsigned char *start = section->start, *vstart = NULL;
635@@ -6893,13 +7217,9 @@ display_debug_loc (struct dwarf_section
636 	}
637
638       SAFE_BYTE_GET_AND_INC (offset_entry_count, hdrptr, 4, end);
639+
640       if (offset_entry_count != 0)
641-	{
642-	  warn (_("The %s section contains "
643-		  "unsupported offset entry count: %d.\n"),
644-		section->name, offset_entry_count);
645-	  return 0;
646-	}
647+	return display_offset_entry_loclists (section);
648
649       expected_start = hdrptr - section_begin;
650     }
651@@ -6959,9 +7279,10 @@ display_debug_loc (struct dwarf_section
652   if (debug_information [first].num_loc_offsets > 0
653       && debug_information [first].loc_offsets [0] != expected_start
654       && debug_information [first].loc_views [0] != expected_start)
655-    warn (_("Location lists in %s section start at 0x%s\n"),
656+    warn (_("Location lists in %s section start at 0x%s rather than 0x%s\n"),
657 	  section->name,
658-	  dwarf_vmatoa ("x", debug_information [first].loc_offsets [0]));
659+	  dwarf_vmatoa ("x", debug_information [first].loc_offsets [0]),
660+	  dwarf_vmatoa ("x", expected_start));
661
662   if (!locs_sorted)
663     array = (unsigned int *) xcmalloc (num_loc_list, sizeof (unsigned int));
664@@ -7639,24 +7960,44 @@ display_debug_rnglists_list (unsigned ch
665 	case DW_RLE_end_of_list:
666 	  printf (_("<End of list>\n"));
667 	  break;
668-	case DW_RLE_base_address:
669-	  SAFE_BYTE_GET_AND_INC (base_address, start, pointer_size, finish);
670+	case DW_RLE_base_addressx:
671+	  READ_ULEB (base_address, start, finish);
672+	  print_dwarf_vma (base_address, pointer_size);
673+	  printf (_("(base address index) "));
674+	  base_address = fetch_indexed_addr (base_address, pointer_size);
675 	  print_dwarf_vma (base_address, pointer_size);
676 	  printf (_("(base address)\n"));
677 	  break;
678-	case DW_RLE_start_length:
679-	  SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
680+	case DW_RLE_startx_endx:
681+	  READ_ULEB (begin, start, finish);
682+	  READ_ULEB (end, start, finish);
683+	  begin = fetch_indexed_addr (begin, pointer_size);
684+	  end   = fetch_indexed_addr (begin, pointer_size);
685+	  break;
686+	case DW_RLE_startx_length:
687+	  READ_ULEB (begin, start, finish);
688 	  READ_ULEB (length, start, finish);
689+	  begin = fetch_indexed_addr (begin, pointer_size);
690 	  end = begin + length;
691 	  break;
692 	case DW_RLE_offset_pair:
693 	  READ_ULEB (begin, start, finish);
694 	  READ_ULEB (end, start, finish);
695 	  break;
696+	case DW_RLE_base_address:
697+	  SAFE_BYTE_GET_AND_INC (base_address, start, pointer_size, finish);
698+	  print_dwarf_vma (base_address, pointer_size);
699+	  printf (_("(base address)\n"));
700+	  break;
701 	case DW_RLE_start_end:
702 	  SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
703 	  SAFE_BYTE_GET_AND_INC (end, start, pointer_size, finish);
704 	  break;
705+	case DW_RLE_start_length:
706+	  SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish);
707+	  READ_ULEB (length, start, finish);
708+	  end = begin + length;
709+	  break;
710 	default:
711 	  error (_("Invalid range list entry type %d\n"), rlet);
712 	  rlet = DW_RLE_end_of_list;
713@@ -7664,7 +8005,7 @@ display_debug_rnglists_list (unsigned ch
714 	}
715       if (rlet == DW_RLE_end_of_list)
716 	break;
717-      if (rlet == DW_RLE_base_address)
718+      if (rlet == DW_RLE_base_address || rlet == DW_RLE_base_addressx)
719 	continue;
720
721       /* Only a DW_RLE_offset_pair needs the base address added.  */
722@@ -7709,6 +8050,8 @@ display_debug_ranges (struct dwarf_secti
723       return 0;
724     }
725
726+  introduce (section, false);
727+
728   if (is_rnglists)
729     {
730       dwarf_vma initial_length;
731@@ -7745,19 +8088,19 @@ display_debug_ranges (struct dwarf_secti
732 	    }
733 	}
734
735-      /* Get and check the version number.  */
736+      /* Get the other fields in the header.  */
737       SAFE_BYTE_GET_AND_INC (version, start, 2, finish);
738-
739-      if (version != 5)
740-	{
741-	  warn (_("Only DWARF version 5 debug_rnglists info "
742-		  "is currently supported.\n"));
743-	  return 0;
744-	}
745-
746       SAFE_BYTE_GET_AND_INC (address_size, start, 1, finish);
747-
748       SAFE_BYTE_GET_AND_INC (segment_selector_size, start, 1, finish);
749+      SAFE_BYTE_GET_AND_INC (offset_entry_count, start, 4, finish);
750+
751+      printf (_("  Length:          0x%s\n"), dwarf_vmatoa ("x", initial_length));
752+      printf (_("  DWARF version:   %u\n"), version);
753+      printf (_("  Address size:    %u\n"), address_size);
754+      printf (_("  Segment size:    %u\n"), segment_selector_size);
755+      printf (_("  Offset entries:  %u\n"), offset_entry_count);
756+
757+      /* Check the fields.  */
758       if (segment_selector_size != 0)
759 	{
760 	  warn (_("The %s section contains "
761@@ -7766,16 +8109,39 @@ display_debug_ranges (struct dwarf_secti
762 	  return 0;
763 	}
764
765-      SAFE_BYTE_GET_AND_INC (offset_entry_count, start, 4, finish);
766-      if (offset_entry_count != 0)
767+      if (version < 5)
768 	{
769-	  warn (_("The %s section contains "
770-		  "unsupported offset entry count: %u.\n"),
771-		section->name, offset_entry_count);
772+	  warn (_("Only DWARF version 5+ debug_rnglists info "
773+		  "is currently supported.\n"));
774 	  return 0;
775 	}
776-    }
777
778+      if (offset_entry_count != 0)
779+	{
780+	  printf (_("\n   Offsets starting at 0x%lx:\n"), (long)(start - section->start));
781+	  if (offset_size == 8)
782+	    {
783+	      for (i = 0; i < offset_entry_count; i++)
784+		{
785+		  dwarf_vma entry;
786+
787+		  SAFE_BYTE_GET_AND_INC (entry, start, 8, finish);
788+		  printf (_("    [%6u] 0x%s\n"), i, dwarf_vmatoa ("x", entry));
789+		}
790+	    }
791+	  else
792+	    {
793+	      for (i = 0; i < offset_entry_count; i++)
794+		{
795+		  uint32_t entry;
796+
797+		  SAFE_BYTE_GET_AND_INC (entry, start, 4, finish);
798+		  printf (_("    [%6u] 0x%x\n"), i, entry);
799+		}
800+	    }
801+	}
802+    }
803+
804   if (load_debug_info (file) == 0)
805     {
806       warn (_("Unable to load/parse the .debug_info section, so cannot interpret the %s section.\n"),
807@@ -7834,8 +8200,7 @@ display_debug_ranges (struct dwarf_secti
808     warn (_("Range lists in %s section start at 0x%lx\n"),
809 	  section->name, (unsigned long) range_entries[0].ranges_offset);
810
811-  introduce (section, false);
812-
813+  putchar ('\n');
814   printf (_("    Offset   Begin    End\n"));
815
816   for (i = 0; i < num_range_list; i++)
817@@ -7895,8 +8260,12 @@ display_debug_ranges (struct dwarf_secti
818       start = next;
819       last_start = next;
820
821-      (is_rnglists ? display_debug_rnglists_list : display_debug_ranges_list)
822-	(start, finish, pointer_size, offset, base_address);
823+      if (is_rnglists)
824+	display_debug_rnglists_list
825+	  (start, finish, pointer_size, offset, base_address);
826+      else
827+	display_debug_ranges_list
828+	  (start, finish, pointer_size, offset, base_address);
829     }
830   putchar ('\n');
831
832diff --git a/binutils/dwarf.h b/binutils/dwarf.h
833index 4fc62abfa4c..ccce2461c81 100644
834--- a/binutils/dwarf.h
835+++ b/binutils/dwarf.h
836@@ -181,9 +181,13 @@ typedef struct
837   /* This is an array of offsets to the location view table.  */
838   dwarf_vma *    loc_views;
839   int *          have_frame_base;
840+
841+  /* Information for associating location lists with CUs.  */
842   unsigned int   num_loc_offsets;
843   unsigned int   max_loc_offsets;
844   unsigned int   num_loc_views;
845+  dwarf_vma      loclists_base;
846+
847   /* List of .debug_ranges offsets seen in this .debug_info.  */
848   dwarf_vma *    range_lists;
849   unsigned int   num_range_lists;
850diff --git a/binutils/testsuite/binutils-all/dw5.W b/binutils/testsuite/binutils-all/dw5.W
851index ebab8b7d3b0..bfcdac175ba 100644
852--- a/binutils/testsuite/binutils-all/dw5.W
853+++ b/binutils/testsuite/binutils-all/dw5.W
854@@ -281,7 +281,7 @@ Contents of the .debug_loclists section:
855     00000039 <End of list>
856
857 Contents of the .debug_rnglists section:
858-
859+#...
860     Offset   Begin    End
861     0000000c 0000000000001234 0000000000001236
862     00000016 0000000000001234 0000000000001239
863diff --git a/binutils/testsuite/binutils-all/x86-64/pr26808.dump b/binutils/testsuite/binutils-all/x86-64/pr26808.dump
864index f64f9d008f9..7ef73b24dc9 100644
865--- a/binutils/testsuite/binutils-all/x86-64/pr26808.dump
866+++ b/binutils/testsuite/binutils-all/x86-64/pr26808.dump
867@@ -30,13 +30,13 @@ Contents of the .debug_info.dwo section:
868     <a5>   DW_AT_decl_file   : 1
869     <a6>   DW_AT_decl_line   : 30
870     <a7>   DW_AT_type        : <0x90>
871-    <ab>   DW_AT_low_pc      : (addr_index: 0x0): <no .debug_addr section>
872+    <ab>   DW_AT_low_pc      : (addr_index: 0x0): 0
873     <ac>   DW_AT_high_pc     : 0x304
874     <b4>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
875     <b6>   DW_AT_GNU_all_tail_call_sites: 1
876     <b6>   DW_AT_sibling     : <0x11b>
877  <2><ba>: Abbrev Number: 14 (DW_TAG_lexical_block)
878-    <bb>   DW_AT_low_pc      : (addr_index: 0x1): <no .debug_addr section>
879+    <bb>   DW_AT_low_pc      : (addr_index: 0x1): 0
880     <bc>   DW_AT_high_pc     : 0x2fa
881  <3><c4>: Abbrev Number: 15 (DW_TAG_variable)
882     <c5>   DW_AT_name        : c1
883@@ -56,7 +56,7 @@ Contents of the .debug_info.dwo section:
884     <ff>   DW_AT_artificial  : 1
885     <ff>   DW_AT_location    : 2 byte block: fb 2 	(DW_OP_GNU_addr_index <0x2>)
886  <3><102>: Abbrev Number: 14 (DW_TAG_lexical_block)
887-    <103>   DW_AT_low_pc      : (addr_index: 0x3): <no .debug_addr section>
888+    <103>   DW_AT_low_pc      : (addr_index: 0x3): 0
889     <104>   DW_AT_high_pc     : 0x2f
890  <4><10c>: Abbrev Number: 17 (DW_TAG_variable)
891     <10d>   DW_AT_name        : i
892@@ -274,7 +274,7 @@ Contents of the .debug_info.dwo section:
893     <2dd>   DW_AT_decl_file   : 1
894     <2de>   DW_AT_decl_line   : 70
895     <2df>   DW_AT_linkage_name: _Z4f13iv
896-    <2e8>   DW_AT_low_pc      : (addr_index: 0x0): <no .debug_addr section>
897+    <2e8>   DW_AT_low_pc      : (addr_index: 0x0): 0
898     <2e9>   DW_AT_high_pc     : 0x6
899     <2f1>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
900     <2f3>   DW_AT_GNU_all_call_sites: 1
901@@ -282,7 +282,7 @@ Contents of the .debug_info.dwo section:
902     <2f4>   DW_AT_specification: <0x219>
903     <2f8>   DW_AT_decl_file   : 2
904     <2f9>   DW_AT_decl_line   : 30
905-    <2fa>   DW_AT_low_pc      : (addr_index: 0x1): <no .debug_addr section>
906+    <2fa>   DW_AT_low_pc      : (addr_index: 0x1): 0
907     <2fb>   DW_AT_high_pc     : 0x20
908     <303>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
909     <305>   DW_AT_object_pointer: <0x30d>
910@@ -300,7 +300,7 @@ Contents of the .debug_info.dwo section:
911     <31d>   DW_AT_specification: <0x223>
912     <321>   DW_AT_decl_file   : 2
913     <322>   DW_AT_decl_line   : 38
914-    <323>   DW_AT_low_pc      : (addr_index: 0x2): <no .debug_addr section>
915+    <323>   DW_AT_low_pc      : (addr_index: 0x2): 0
916     <324>   DW_AT_high_pc     : 0x18
917     <32c>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
918     <32e>   DW_AT_object_pointer: <0x336>
919@@ -316,7 +316,7 @@ Contents of the .debug_info.dwo section:
920     <341>   DW_AT_specification: <0x22d>
921     <345>   DW_AT_decl_file   : 2
922     <346>   DW_AT_decl_line   : 46
923-    <347>   DW_AT_low_pc      : (addr_index: 0x3): <no .debug_addr section>
924+    <347>   DW_AT_low_pc      : (addr_index: 0x3): 0
925     <348>   DW_AT_high_pc     : 0x18
926     <350>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
927     <352>   DW_AT_object_pointer: <0x35a>
928@@ -332,7 +332,7 @@ Contents of the .debug_info.dwo section:
929     <365>   DW_AT_specification: <0x237>
930     <369>   DW_AT_decl_file   : 2
931     <36a>   DW_AT_decl_line   : 54
932-    <36b>   DW_AT_low_pc      : (addr_index: 0x4): <no .debug_addr section>
933+    <36b>   DW_AT_low_pc      : (addr_index: 0x4): 0
934     <36c>   DW_AT_high_pc     : 0x16
935     <374>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
936     <376>   DW_AT_object_pointer: <0x37e>
937@@ -348,7 +348,7 @@ Contents of the .debug_info.dwo section:
938     <389>   DW_AT_specification: <0x26b>
939     <38d>   DW_AT_decl_file   : 2
940     <38e>   DW_AT_decl_line   : 62
941-    <38f>   DW_AT_low_pc      : (addr_index: 0x5): <no .debug_addr section>
942+    <38f>   DW_AT_low_pc      : (addr_index: 0x5): 0
943     <390>   DW_AT_high_pc     : 0x16
944     <398>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
945     <39a>   DW_AT_object_pointer: <0x3a2>
946@@ -366,7 +366,7 @@ Contents of the .debug_info.dwo section:
947     <3b2>   DW_AT_specification: <0x275>
948     <3b6>   DW_AT_decl_file   : 2
949     <3b7>   DW_AT_decl_line   : 72
950-    <3b8>   DW_AT_low_pc      : (addr_index: 0x6): <no .debug_addr section>
951+    <3b8>   DW_AT_low_pc      : (addr_index: 0x6): 0
952     <3b9>   DW_AT_high_pc     : 0x1b
953     <3c1>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
954     <3c3>   DW_AT_object_pointer: <0x3cb>
955@@ -382,7 +382,7 @@ Contents of the .debug_info.dwo section:
956     <3d6>   DW_AT_specification: <0x27f>
957     <3da>   DW_AT_decl_file   : 2
958     <3db>   DW_AT_decl_line   : 82
959-    <3dc>   DW_AT_low_pc      : (addr_index: 0x7): <no .debug_addr section>
960+    <3dc>   DW_AT_low_pc      : (addr_index: 0x7): 0
961     <3dd>   DW_AT_high_pc     : 0x1b
962     <3e5>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
963     <3e7>   DW_AT_object_pointer: <0x3ef>
964@@ -398,7 +398,7 @@ Contents of the .debug_info.dwo section:
965     <3fa>   DW_AT_specification: <0x289>
966     <3fe>   DW_AT_decl_file   : 2
967     <3ff>   DW_AT_decl_line   : 92
968-    <400>   DW_AT_low_pc      : (addr_index: 0x8): <no .debug_addr section>
969+    <400>   DW_AT_low_pc      : (addr_index: 0x8): 0
970     <401>   DW_AT_high_pc     : 0x19
971     <409>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
972     <40b>   DW_AT_object_pointer: <0x413>
973@@ -414,7 +414,7 @@ Contents of the .debug_info.dwo section:
974     <41e>   DW_AT_specification: <0x2ae>
975     <422>   DW_AT_decl_file   : 2
976     <423>   DW_AT_decl_line   : 102
977-    <424>   DW_AT_low_pc      : (addr_index: 0x9): <no .debug_addr section>
978+    <424>   DW_AT_low_pc      : (addr_index: 0x9): 0
979     <425>   DW_AT_high_pc     : 0x19
980     <42d>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
981     <42f>   DW_AT_object_pointer: <0x437>
982@@ -432,7 +432,7 @@ Contents of the .debug_info.dwo section:
983     <447>   DW_AT_specification: <0x2b8>
984     <44b>   DW_AT_decl_file   : 2
985     <44c>   DW_AT_decl_line   : 112
986-    <44d>   DW_AT_low_pc      : (addr_index: 0xa): <no .debug_addr section>
987+    <44d>   DW_AT_low_pc      : (addr_index: 0xa): 0
988     <44e>   DW_AT_high_pc     : 0x1f
989     <456>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
990     <458>   DW_AT_object_pointer: <0x460>
991@@ -451,7 +451,7 @@ Contents of the .debug_info.dwo section:
992     <471>   DW_AT_decl_line   : 120
993     <472>   DW_AT_linkage_name: _Z4f11av
994     <47b>   DW_AT_type        : <0x242>
995-    <47f>   DW_AT_low_pc      : (addr_index: 0xb): <no .debug_addr section>
996+    <47f>   DW_AT_low_pc      : (addr_index: 0xb): 0
997     <480>   DW_AT_high_pc     : 0xb
998     <488>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
999     <48a>   DW_AT_GNU_all_call_sites: 1
1000@@ -459,7 +459,7 @@ Contents of the .debug_info.dwo section:
1001     <48b>   DW_AT_specification: <0x2c2>
1002     <48f>   DW_AT_decl_file   : 2
1003     <490>   DW_AT_decl_line   : 126
1004-    <491>   DW_AT_low_pc      : (addr_index: 0xc): <no .debug_addr section>
1005+    <491>   DW_AT_low_pc      : (addr_index: 0xc): 0
1006     <492>   DW_AT_high_pc     : 0x20
1007     <49a>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1008     <49c>   DW_AT_object_pointer: <0x4a4>
1009@@ -478,7 +478,7 @@ Contents of the .debug_info.dwo section:
1010     <4b4>   DW_AT_decl_line   : 134
1011     <4b5>   DW_AT_linkage_name: _Z3t12v
1012     <4bd>   DW_AT_type        : <0x249>
1013-    <4c1>   DW_AT_low_pc      : (addr_index: 0xd): <no .debug_addr section>
1014+    <4c1>   DW_AT_low_pc      : (addr_index: 0xd): 0
1015     <4c2>   DW_AT_high_pc     : 0x19
1016     <4ca>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1017     <4cc>   DW_AT_GNU_all_tail_call_sites: 1
1018@@ -489,7 +489,7 @@ Contents of the .debug_info.dwo section:
1019     <4d2>   DW_AT_decl_line   : 142
1020     <4d3>   DW_AT_linkage_name: _Z3t13v
1021     <4db>   DW_AT_type        : <0x249>
1022-    <4df>   DW_AT_low_pc      : (addr_index: 0xe): <no .debug_addr section>
1023+    <4df>   DW_AT_low_pc      : (addr_index: 0xe): 0
1024     <4e0>   DW_AT_high_pc     : 0x14
1025     <4e8>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1026     <4ea>   DW_AT_GNU_all_tail_call_sites: 1
1027@@ -500,13 +500,13 @@ Contents of the .debug_info.dwo section:
1028     <4f0>   DW_AT_decl_line   : 150
1029     <4f1>   DW_AT_linkage_name: _Z3t14v
1030     <4f9>   DW_AT_type        : <0x249>
1031-    <4fd>   DW_AT_low_pc      : (addr_index: 0xf): <no .debug_addr section>
1032+    <4fd>   DW_AT_low_pc      : (addr_index: 0xf): 0
1033     <4fe>   DW_AT_high_pc     : 0x61
1034     <506>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1035     <508>   DW_AT_GNU_all_tail_call_sites: 1
1036     <508>   DW_AT_sibling     : <0x532>
1037  <2><50c>: Abbrev Number: 24 (DW_TAG_lexical_block)
1038-    <50d>   DW_AT_low_pc      : (addr_index: 0x10): <no .debug_addr section>
1039+    <50d>   DW_AT_low_pc      : (addr_index: 0x10): 0
1040     <50e>   DW_AT_high_pc     : 0x57
1041  <3><516>: Abbrev Number: 25 (DW_TAG_variable)
1042     <517>   DW_AT_name        : s1
1043@@ -538,13 +538,13 @@ Contents of the .debug_info.dwo section:
1044     <54b>   DW_AT_decl_line   : 163
1045     <54c>   DW_AT_linkage_name: _Z3t15v
1046     <554>   DW_AT_type        : <0x249>
1047-    <558>   DW_AT_low_pc      : (addr_index: 0x11): <no .debug_addr section>
1048+    <558>   DW_AT_low_pc      : (addr_index: 0x11): 0
1049     <559>   DW_AT_high_pc     : 0x5d
1050     <561>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1051     <563>   DW_AT_GNU_all_tail_call_sites: 1
1052     <563>   DW_AT_sibling     : <0x58d>
1053  <2><567>: Abbrev Number: 24 (DW_TAG_lexical_block)
1054-    <568>   DW_AT_low_pc      : (addr_index: 0x12): <no .debug_addr section>
1055+    <568>   DW_AT_low_pc      : (addr_index: 0x12): 0
1056     <569>   DW_AT_high_pc     : 0x53
1057  <3><571>: Abbrev Number: 25 (DW_TAG_variable)
1058     <572>   DW_AT_name        : s1
1059@@ -576,7 +576,7 @@ Contents of the .debug_info.dwo section:
1060     <5a9>   DW_AT_decl_line   : 176
1061     <5aa>   DW_AT_linkage_name: _Z3t16v
1062     <5b2>   DW_AT_type        : <0x249>
1063-    <5b6>   DW_AT_low_pc      : (addr_index: 0x13): <no .debug_addr section>
1064+    <5b6>   DW_AT_low_pc      : (addr_index: 0x13): 0
1065     <5b7>   DW_AT_high_pc     : 0x13
1066     <5bf>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1067     <5c1>   DW_AT_GNU_all_tail_call_sites: 1
1068@@ -587,13 +587,13 @@ Contents of the .debug_info.dwo section:
1069     <5c7>   DW_AT_decl_line   : 184
1070     <5c8>   DW_AT_linkage_name: _Z3t17v
1071     <5d0>   DW_AT_type        : <0x249>
1072-    <5d4>   DW_AT_low_pc      : (addr_index: 0x14): <no .debug_addr section>
1073+    <5d4>   DW_AT_low_pc      : (addr_index: 0x14): 0
1074     <5d5>   DW_AT_high_pc     : 0x5f
1075     <5dd>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1076     <5df>   DW_AT_GNU_all_call_sites: 1
1077     <5df>   DW_AT_sibling     : <0x612>
1078  <2><5e3>: Abbrev Number: 24 (DW_TAG_lexical_block)
1079-    <5e4>   DW_AT_low_pc      : (addr_index: 0x15): <no .debug_addr section>
1080+    <5e4>   DW_AT_low_pc      : (addr_index: 0x15): 0
1081     <5e5>   DW_AT_high_pc     : 0x59
1082  <3><5ed>: Abbrev Number: 25 (DW_TAG_variable)
1083     <5ee>   DW_AT_name        : c
1084@@ -602,7 +602,7 @@ Contents of the .debug_info.dwo section:
1085     <5f2>   DW_AT_type        : <0x53d>
1086     <5f6>   DW_AT_location    : 2 byte block: 91 6f 	(DW_OP_fbreg: -17)
1087  <3><5f9>: Abbrev Number: 24 (DW_TAG_lexical_block)
1088-    <5fa>   DW_AT_low_pc      : (addr_index: 0x16): <no .debug_addr section>
1089+    <5fa>   DW_AT_low_pc      : (addr_index: 0x16): 0
1090     <5fb>   DW_AT_high_pc     : 0x50
1091  <4><603>: Abbrev Number: 25 (DW_TAG_variable)
1092     <604>   DW_AT_name        : i
1093@@ -620,13 +620,13 @@ Contents of the .debug_info.dwo section:
1094     <618>   DW_AT_decl_line   : 199
1095     <619>   DW_AT_linkage_name: _Z3t18v
1096     <621>   DW_AT_type        : <0x249>
1097-    <625>   DW_AT_low_pc      : (addr_index: 0x17): <no .debug_addr section>
1098+    <625>   DW_AT_ow_pc      : (addr_index: 0x17): 0
1099     <626>   DW_AT_high_pc     : 0x5f
1100     <62e>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1101     <630>   DW_AT_GNU_all_tail_call_sites: 1
1102     <630>   DW_AT_sibling     : <0x67a>
1103  <2><634>: Abbrev Number: 24 (DW_TAG_lexical_block)
1104-    <635>   DW_AT_low_pc      : (addr_index: 0x18): <no .debug_addr section>
1105+    <635>   DW_AT_low_pc      : (addr_index: 0x18): 0
1106     <636>   DW_AT_high_pc     : 0x55
1107  <3><63e>: Abbrev Number: 25 (DW_TAG_variable)
1108     <63f>   DW_AT_name        : c
1109@@ -635,7 +635,7 @@ Contents of the .debug_info.dwo section:
1110     <643>   DW_AT_type        : <0x53d>
1111     <647>   DW_AT_location    : 2 byte block: 91 6f 	(DW_OP_fbreg: -17)
1112  <3><64a>: Abbrev Number: 24 (DW_TAG_lexical_block)
1113-    <64b>   DW_AT_low_pc      : (addr_index: 0x19): <no .debug_addr section>
1114+    <64b>   DW_AT_low_pc      : (addr_index: 0x19): 0
1115     <64c>   DW_AT_high_pc     : 0x4c
1116  <4><654>: Abbrev Number: 25 (DW_TAG_variable)
1117     <655>   DW_AT_name        : i
1118@@ -644,7 +644,7 @@ Contents of the .debug_info.dwo section:
1119     <659>   DW_AT_type        : <0x242>
1120     <65d>   DW_AT_location    : 2 byte block: 91 68 	(DW_OP_fbreg: -24)
1121  <4><660>: Abbrev Number: 24 (DW_TAG_lexical_block)
1122-    <661>   DW_AT_low_pc      : (addr_index: 0x1a): <no .debug_addr section>
1123+    <661>   DW_AT_low_pc      : (addr_index: 0x1a): 0
1124     <662>   DW_AT_high_pc     : 0x34
1125  <5><66a>: Abbrev Number: 25 (DW_TAG_variable)
1126     <66b>   DW_AT_name        : s
1127@@ -786,7 +786,7 @@ Contents of the .debug_info.dwo section:
1128     <7d3>   DW_AT_decl_line   : 32
1129     <7d4>   DW_AT_linkage_name: _Z4t16av
1130     <7dd>   DW_AT_type        : <0x7c4>
1131-    <7e1>   DW_AT_low_pc      : (addr_index: 0x0): <no .debug_addr section>
1132+    <7e1>   DW_AT_low_pc      : (addr_index: 0x0): 0
1133     <7e2>   DW_AT_high_pc     : 0x13
1134     <7ea>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1135     <7ec>   DW_AT_GNU_all_tail_call_sites: 1
1136@@ -878,14 +878,14 @@ Contents of the .debug_info.dwo section:
1137     <908>   DW_AT_decl_file   : 1
1138     <909>   DW_AT_decl_line   : 70
1139     <90a>   DW_AT_linkage_name: _Z4f13iv
1140-    <913>   DW_AT_low_pc      : (addr_index: 0x0): <no .debug_addr section>
1141+    <913>   DW_AT_low_pc      : (addr_index: 0x0): 0
1142     <914>   DW_AT_high_pc     : 0x6
1143     <91c>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1144     <91e>   DW_AT_GNU_all_call_sites: 1
1145  <1><91e>: Abbrev Number: 17 (DW_TAG_subprogram)
1146     <91f>   DW_AT_specification: <0x8a8>
1147     <923>   DW_AT_decl_file   : 2
1148-    <924>   DW_AT_low_pc      : (addr_index: 0x1): <no .debug_addr section>
1149+    <924>   DW_AT_low_pc      : (addr_index: 0x1): 0
1150     <925>   DW_AT_high_pc     : 0xf
1151     <92d>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1152     <92f>   DW_AT_object_pointer: <0x937>
1153@@ -903,7 +903,7 @@ Contents of the .debug_info.dwo section:
1154     <94b>   DW_AT_specification: <0x89b>
1155     <94f>   DW_AT_decl_file   : 2
1156     <950>   DW_AT_decl_line   : 36
1157-    <951>   DW_AT_low_pc      : (addr_index: 0x2): <no .debug_addr section>
1158+    <951>   DW_AT_low_pc      : (addr_index: 0x2): 0
1159     <952>   DW_AT_high_pc     : 0x20
1160     <95a>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1161     <95c>   DW_AT_object_pointer: <0x964>
1162@@ -922,7 +922,7 @@ Contents of the .debug_info.dwo section:
1163     <978>   DW_AT_decl_line   : 72
1164     <979>   DW_AT_linkage_name: _Z3f10v
1165     <981>   DW_AT_type        : <0x8b7>
1166-    <985>   DW_AT_low_pc      : (addr_index: 0x3): <no .debug_addr section>
1167+    <985>   DW_AT_low_pc      : (addr_index: 0x3): 0
1168     <986>   DW_AT_high_pc     : 0xb
1169     <98e>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1170     <990>   DW_AT_GNU_all_call_sites: 1
1171@@ -933,7 +933,7 @@ Contents of the .debug_info.dwo section:
1172     <997>   DW_AT_decl_line   : 80
1173     <998>   DW_AT_linkage_name: _Z4f11bPFivE
1174     <9a5>   DW_AT_type        : <0x8b7>
1175-    <9a9>   DW_AT_low_pc      : (addr_index: 0x4): <no .debug_addr section>
1176+    <9a9>   DW_AT_low_pc      : (addr_index: 0x4): 0
1177     <9aa>   DW_AT_high_pc     : 0x14
1178     <9b2>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1179     <9b4>   DW_AT_GNU_all_tail_call_sites: 1
1180@@ -954,7 +954,7 @@ Contents of the .debug_info.dwo section:
1181     <9d3>   DW_AT_specification: <0x8e0>
1182     <9d7>   DW_AT_decl_file   : 2
1183     <9d8>   DW_AT_decl_line   : 88
1184-    <9d9>   DW_AT_low_pc      : (addr_index: 0x5): <no .debug_addr section>
1185+    <9d9>   DW_AT_low_pc      : (addr_index: 0x5): 0
1186     <9da>   DW_AT_high_pc     : 0xf
1187     <9e2>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1188     <9e4>   DW_AT_object_pointer: <0x9ec>
1189@@ -976,7 +976,7 @@ Contents of the .debug_info.dwo section:
1190     <a06>   DW_AT_decl_line   : 96
1191     <a07>   DW_AT_linkage_name: _Z3f13v
1192     <a0f>   DW_AT_type        : <0xa1e>
1193-    <a13>   DW_AT_low_pc      : (addr_index: 0x6): <no .debug_addr section>
1194+    <a13>   DW_AT_low_pc      : (addr_index: 0x6): 0
1195     <a14>   DW_AT_high_pc     : 0xb
1196     <a1c>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1197     <a1e>   DW_AT_GNU_all_call_sites: 1
1198@@ -990,7 +990,7 @@ Contents of the .debug_info.dwo section:
1199     <a2a>   DW_AT_decl_line   : 104
1200     <a2b>   DW_AT_linkage_name: _Z3f14v
1201     <a33>   DW_AT_type        : <0xa42>
1202-    <a37>   DW_AT_low_pc      : (addr_index: 0x7): <no .debug_addr section>
1203+    <a37>   DW_AT_low_pc      : (addr_index: 0x7): 0
1204     <a38>   DW_AT_high_pc     : 0xb
1205     <a40>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1206     <a42>   DW_AT_GNU_all_call_sites: 1
1207@@ -1010,7 +1010,7 @@ Contents of the .debug_info.dwo section:
1208     <a5b>   DW_AT_decl_line   : 112
1209     <a5c>   DW_AT_linkage_name: _Z3f15v
1210     <a64>   DW_AT_type        : <0xa73>
1211-    <a68>   DW_AT_low_pc      : (addr_index: 0x8): <no .debug_addr section>
1212+    <a68>   DW_AT_low_pc      : (addr_index: 0x8): 0
1213     <a69>   DW_AT_high_pc     : 0xb
1214     <a71>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1215     <a73>   DW_AT_GNU_all_call_sites: 1
1216@@ -1030,7 +1030,7 @@ Contents of the .debug_info.dwo section:
1217     <a8f>   DW_AT_decl_line   : 127
1218     <a90>   DW_AT_linkage_name: _Z3f18i
1219     <a98>   DW_AT_type        : <0xa42>
1220-    <a9c>   DW_AT_low_pc      : (addr_index: 0x9): <no .debug_addr section>
1221+    <a9c>   DW_AT_low_pc      : (addr_index: 0x9): 0
1222     <a9d>   DW_AT_high_pc     : 0x44
1223     <aa5>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
1224     <aa7>   DW_AT_GNU_all_call_sites: 1
1225