--- binutils.orig/binutils/dwarf.c 2020-11-03 17:10:15.182386267 +0000 +++ binutils-2.35.1/binutils/dwarf.c 2020-11-03 17:14:38.660411672 +0000 @@ -876,6 +876,7 @@ typedef struct abbrev_list { abbrev_entry * first_abbrev; abbrev_entry * last_abbrev; + dwarf_vma abbrev_base; dwarf_vma abbrev_offset; struct abbrev_list * next; unsigned char * start_of_next_abbrevs; @@ -955,10 +956,11 @@ free_all_abbrevs (void) } static abbrev_list * -new_abbrev_list (dwarf_vma abbrev_offset) +new_abbrev_list (dwarf_vma abbrev_base, dwarf_vma abbrev_offset) { abbrev_list * list = (abbrev_list *) xcalloc (sizeof * list, 1); + list->abbrev_base = abbrev_base; list->abbrev_offset = abbrev_offset; list->next = abbrev_lists; @@ -968,12 +970,14 @@ new_abbrev_list (dwarf_vma abbrev_offset } static abbrev_list * -find_abbrev_list_by_abbrev_offset (dwarf_vma abbrev_offset) +find_abbrev_list_by_abbrev_offset (dwarf_vma abbrev_base, + dwarf_vma abbrev_offset) { abbrev_list * list; for (list = abbrev_lists; list != NULL; list = list->next) - if (list->abbrev_offset == abbrev_offset) + if (list->abbrev_base == abbrev_base + && list->abbrev_offset == abbrev_offset) return list; return NULL; @@ -2415,10 +2419,10 @@ read_and_display_attr_value (unsigned lo case DW_FORM_ref_addr: if (dwarf_version == 2) SAFE_BYTE_GET_AND_INC (uvalue, data, pointer_size, end); - else if (dwarf_version == 3 || dwarf_version == 4) + else if (dwarf_version > 2) SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end); else - error (_("Internal error: DWARF version is not 2, 3 or 4.\n")); + error (_("Internal error: DW_FORM_ref_addr is not supported in DWARF version 1.\n")); break; case DW_FORM_addr: @@ -3455,6 +3459,8 @@ process_debug_info (struct dwarf_section { DWARF2_Internal_CompUnit compunit; unsigned char * hdrptr; + dwarf_vma abbrev_base; + size_t abbrev_size; dwarf_vma cu_offset; unsigned int offset_size; unsigned int initial_length_size; @@ -3499,25 +3505,25 @@ process_debug_info (struct dwarf_section SAFE_BYTE_GET_AND_INC (compunit.cu_abbrev_offset, hdrptr, offset_size, end); - list = find_abbrev_list_by_abbrev_offset (compunit.cu_abbrev_offset); + if (this_set == NULL) + { + abbrev_base = 0; + abbrev_size = debug_displays [abbrev_sec].section.size; + } + else + { + abbrev_base = this_set->section_offsets [DW_SECT_ABBREV]; + abbrev_size = this_set->section_sizes [DW_SECT_ABBREV]; + } + + list = find_abbrev_list_by_abbrev_offset (abbrev_base, + compunit.cu_abbrev_offset); if (list == NULL) { - dwarf_vma abbrev_base; - size_t abbrev_size; unsigned char * next; - if (this_set == NULL) - { - abbrev_base = 0; - abbrev_size = debug_displays [abbrev_sec].section.size; - } - else - { - abbrev_base = this_set->section_offsets [DW_SECT_ABBREV]; - abbrev_size = this_set->section_sizes [DW_SECT_ABBREV]; - } - - list = new_abbrev_list (compunit.cu_abbrev_offset); + list = new_abbrev_list (abbrev_base, + compunit.cu_abbrev_offset); next = process_abbrev_set (((unsigned char *) debug_displays [abbrev_sec].section.start + abbrev_base + compunit.cu_abbrev_offset), @@ -3734,12 +3740,14 @@ process_debug_info (struct dwarf_section (unsigned long) debug_displays [abbrev_sec].section.size); else { - list = find_abbrev_list_by_abbrev_offset (compunit.cu_abbrev_offset); + list = find_abbrev_list_by_abbrev_offset (abbrev_base, + compunit.cu_abbrev_offset); if (list == NULL) { unsigned char * next; - list = new_abbrev_list (compunit.cu_abbrev_offset); + list = new_abbrev_list (abbrev_base, + compunit.cu_abbrev_offset); next = process_abbrev_set (((unsigned char *) debug_displays [abbrev_sec].section.start + abbrev_base + compunit.cu_abbrev_offset), @@ -5304,7 +5312,7 @@ display_debug_lines_decoded (struct dwar else { newFileName = (char *) xmalloc (fileNameLength + 1); - strcpy (newFileName, fileName); + strncpy (newFileName, fileName, fileNameLength + 1); } if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH)) @@ -6029,10 +6037,10 @@ display_debug_abbrev (struct dwarf_secti dwarf_vma offset; offset = start - section->start; - list = find_abbrev_list_by_abbrev_offset (offset); + list = find_abbrev_list_by_abbrev_offset (0, offset); if (list == NULL) { - list = new_abbrev_list (offset); + list = new_abbrev_list (0, offset); start = process_abbrev_set (start, end, list); list->start_of_next_abbrevs = start; }