@@ -2844,6 +2844,7 @@ read_and_display_attr_value (unsigned long attribute,
break;
case DW_AT_GNU_addr_base:
+ case DW_AT_addr_base:
debug_info_p->addr_base = uvalue;
break;
@@ -7308,6 +7309,7 @@ display_debug_addr (struct dwarf_section *section,
debug_addr_info [count]->addr_base = section->size;
qsort (debug_addr_info, count, sizeof (debug_info *), comp_addr_base);
+ unsigned char *header = section->start;
for (i = 0; i < count; i++)
{
unsigned int idx;
@@ -7318,7 +7320,34 @@ display_debug_addr (struct dwarf_section *section,
printf (_("\tIndex\tAddress\n"));
entry = section->start + debug_addr_info [i]->addr_base;
- end = section->start + debug_addr_info [i + 1]->addr_base;
+ if (debug_addr_info [i]->dwarf_version >= 5)
+ {
+ size_t header_size = entry - header;
+ if (header_size != 8 && header_size != 16)
+ return 0;
+
+ unsigned char *curr_header = header;
+
+ dwarf_vma length;
+ SAFE_BYTE_GET_AND_INC (length, curr_header, 4, entry);
+ if (length == 0xffffffff)
+ SAFE_BYTE_GET (length, curr_header, 8, entry);
+ end = curr_header + length;
+
+ int version;
+ SAFE_BYTE_GET_AND_INC (version, curr_header, 2, entry);
+ if (version != 5)
+ warn (_("Unexpected version number in .debug_addr header: %#x\n"), version);
+
+ SAFE_BYTE_GET_AND_INC (address_size, curr_header, 1, entry);
+
+ int segment_selector_size;
+ SAFE_BYTE_GET_AND_INC (segment_selector_size, curr_header, 1, entry);
+ address_size += segment_selector_size;
+ }
+ else
+ end = section->start + debug_addr_info [i + 1]->addr_base;
+ header = end;
idx = 0;
while (entry < end)
{