aboutsummaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2023-08-23 11:36:25 +0100
committerNick Clifton <nickc@redhat.com>2023-08-23 11:36:25 +0100
commit589d38af0de46f3325747a9e29e008c79e41e664 (patch)
treeed52625954a8bf3df776b609664c64c8c4ea8931 /binutils
parent3ce8f906be7a55d8c0375e6d360cc53b456d86ae (diff)
downloadbinutils-589d38af0de46f3325747a9e29e008c79e41e664.zip
binutils-589d38af0de46f3325747a9e29e008c79e41e664.tar.gz
binutils-589d38af0de46f3325747a9e29e008c79e41e664.tar.bz2
readelf/objdump: Handle DWARF info with mixed types of range section.
PR 30791 * dwarf.h (debug_info): Add range_versions field. * dwarf.c (read_and_display_attr_value): When recording a range arribute also ecord the dwarf version number. (is_range_list_for_this_section): New function. (display_debug_ranges): Only show debug ranges whose version is suitable for the secction being displayed.
Diffstat (limited to 'binutils')
-rw-r--r--binutils/ChangeLog10
-rw-r--r--binutils/dwarf.c30
-rw-r--r--binutils/dwarf.h1
3 files changed, 36 insertions, 5 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 65cff80..9e6db82 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,13 @@
+2023-08-23 Nick Clifton <nickc@redhat.com>
+
+ PR 30791
+ * dwarf.h (debug_info): Add range_versions field.
+ * dwarf.c (read_and_display_attr_value): When recording a range
+ arribute also ecord the dwarf version number.
+ (is_range_list_for_this_section): New function.
+ (display_debug_ranges): Only show debug ranges whose version is
+ suitable for the secction being displayed.
+
2023-07-30 Jose E. Marchesi <jose.marchesi@oracle.com>
* readelf.c (get_machine_flags): Recognize and pretty print BPF
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 3ebc45a..7ce5d8e 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -2970,6 +2970,9 @@ read_and_display_attr_value (unsigned long attribute,
debug_info_p->range_lists = (uint64_t *)
xcrealloc (debug_info_p->range_lists,
lmax, sizeof (*debug_info_p->range_lists));
+ debug_info_p->range_versions = (unsigned int *)
+ xcrealloc (debug_info_p->range_versions,
+ lmax, sizeof (*debug_info_p->range_versions));
debug_info_p->max_range_lists = lmax;
}
@@ -2977,6 +2980,7 @@ read_and_display_attr_value (unsigned long attribute,
uvalue = fetch_indexed_value (uvalue, rnglists, 0);
debug_info_p->range_lists [num] = uvalue;
+ debug_info_p->range_versions [num] = dwarf_version;
debug_info_p->num_range_lists++;
}
break;
@@ -8256,6 +8260,18 @@ display_debug_rnglists (struct dwarf_section *section)
return 1;
}
+static bool
+is_range_list_for_this_section (bool is_rnglists, unsigned int version)
+{
+ if (is_rnglists && version > 4)
+ return true;
+
+ if (! is_rnglists && version < 5)
+ return true;
+
+ return false;
+}
+
static int
display_debug_ranges (struct dwarf_section *section,
void *file ATTRIBUTE_UNUSED)
@@ -8268,7 +8284,7 @@ display_debug_ranges (struct dwarf_section *section,
unsigned int num_range_list, i;
struct range_entry *range_entries;
struct range_entry *range_entry_fill;
- int is_rnglists = strstr (section->name, "debug_rnglists") != NULL;
+ bool is_rnglists = strstr (section->name, "debug_rnglists") != NULL;
/* Initialize it due to a false compiler warning. */
unsigned char address_size = 0;
uint64_t last_offset = 0;
@@ -8299,7 +8315,7 @@ display_debug_ranges (struct dwarf_section *section,
{
/* This can happen when the file was compiled with -gsplit-debug
which removes references to range lists from the primary .o file. */
- printf (_("No range lists in .debug_info section.\n"));
+ printf (_("No range lists referenced by .debug_info section.\n"));
return 1;
}
@@ -8314,12 +8330,16 @@ display_debug_ranges (struct dwarf_section *section,
for (j = 0; j < debug_info_p->num_range_lists; j++)
{
- range_entry_fill->ranges_offset = debug_info_p->range_lists[j];
- range_entry_fill->debug_info_p = debug_info_p;
- range_entry_fill++;
+ if (is_range_list_for_this_section (is_rnglists, debug_info_p->range_versions[j]))
+ {
+ range_entry_fill->ranges_offset = debug_info_p->range_lists[j];
+ range_entry_fill->debug_info_p = debug_info_p;
+ range_entry_fill++;
+ }
}
}
+ num_range_list = range_entry_fill - range_entries;
qsort (range_entries, num_range_list, sizeof (*range_entries),
range_entry_compar);
diff --git a/binutils/dwarf.h b/binutils/dwarf.h
index d2f9523..61c4158 100644
--- a/binutils/dwarf.h
+++ b/binutils/dwarf.h
@@ -189,6 +189,7 @@ typedef struct
/* List of .debug_ranges offsets seen in this .debug_info. */
uint64_t * range_lists;
+ unsigned int * range_versions;
unsigned int num_range_lists;
unsigned int max_range_lists;
uint64_t rnglists_base;