aboutsummaryrefslogtreecommitdiff
path: root/binutils/readelf.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2004-12-22 11:04:44 +0000
committerNick Clifton <nickc@redhat.com>2004-12-22 11:04:44 +0000
commit76a56260628e949cd60b00f8035a53cbadca61ad (patch)
treeddf7940b89fa9f07f0e100925f8a8f01d594693d /binutils/readelf.c
parent911a63006ce7686ef257250e1e0c4f960791d79b (diff)
downloadgdb-76a56260628e949cd60b00f8035a53cbadca61ad.zip
gdb-76a56260628e949cd60b00f8035a53cbadca61ad.tar.gz
gdb-76a56260628e949cd60b00f8035a53cbadca61ad.tar.bz2
readelf.c (last_pointer_size, warned_about_missing_comp_units):
New variables associated with obtaining the pointer size for a comp_unit. (get_pointer_size_of_comp_unit): Add an extra parameter - the name of the section requesting the pointer size. Use this name in error messages. If there are not enough comp_units available produce a warning message, but return the last known pointer size so that section dumping can continue. (get_debug_info): Reset the new variables. (display_debug_lines): Add extra parameter to invocation of get_pointer_size_of_comp_unit and remove error message when it returns 0. (display_debug_loc): Likewise.
Diffstat (limited to 'binutils/readelf.c')
-rw-r--r--binutils/readelf.c53
1 files changed, 36 insertions, 17 deletions
diff --git a/binutils/readelf.c b/binutils/readelf.c
index ac0a21a..3610376 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -7079,15 +7079,36 @@ debug_info;
static debug_info * debug_information = NULL;
static unsigned int num_debug_info_entries = 0;
+static unsigned int last_pointer_size = 0;
+static int warned_about_missing_comp_units = FALSE;
static unsigned int
-get_pointer_size_of_comp_unit (unsigned int comp_unit)
+get_pointer_size_of_comp_unit (unsigned int comp_unit,
+ const char * section_name)
{
- if (num_debug_info_entries == 0
- || comp_unit >= num_debug_info_entries)
- return 0;
+ if (num_debug_info_entries == 0)
+ {
+ error (_("%s section needs a populated .debug_info section\n"),
+ section_name);
+ return 0;
+ }
+
+ if (comp_unit >= num_debug_info_entries)
+ {
+ if (!warned_about_missing_comp_units)
+ {
+ warn (_("%s section has more comp units than .debug_info section\n"),
+ section_name);
+ warn (_("assuming that the pointer size is %d, from the last comp unit in .debug_info\n\n"),
+ last_pointer_size);
+ warned_about_missing_comp_units = TRUE;
+ }
+ }
+ else
+ last_pointer_size = debug_information [comp_unit].pointer_size;
+
+ return last_pointer_size;
- return debug_information [comp_unit].pointer_size;
}
/* Locate and scan the .debug_info section in the file and record the pointer
@@ -7107,6 +7128,12 @@ get_debug_info (FILE * file)
unsigned int num_units;
unsigned int unit;
+ /* Reset the last pointer size so that we can issue correct
+ error messages if we are displaying the contents of more
+ than one file. */
+ last_pointer_size = 0;
+ warned_about_missing_comp_units = FALSE;
+
/* If we already have the information there is nothing else to do. */
if (num_debug_info_entries > 0)
return num_debug_info_entries;
@@ -7275,12 +7302,8 @@ display_debug_lines (Elf_Internal_Shdr *section,
/* Get the pointer size from the comp unit associated
with this block of line number information. */
- pointer_size = get_pointer_size_of_comp_unit (comp_unit);
- if (pointer_size == 0)
- {
- error (_("Not enough comp units for .debug_line section\n"));
- return 0;
- }
+ pointer_size = get_pointer_size_of_comp_unit (comp_unit,
+ ".debug_lines");
comp_unit ++;
printf (_(" Length: %ld\n"), info.li_length);
@@ -8487,12 +8510,8 @@ display_debug_loc (Elf_Internal_Shdr *section,
/* Get the pointer size from the comp unit associated
with this block of location information. */
- pointer_size = get_pointer_size_of_comp_unit (comp_unit);
- if (pointer_size == 0)
- {
- error (_("Not enough comp units for .debug_loc section\n"));
- return 0;
- }
+ pointer_size = get_pointer_size_of_comp_unit (comp_unit, ".debug_loc");
+
comp_unit ++;
while (1)