diff options
author | Nick Clifton <nickc@redhat.com> | 2004-12-22 11:04:44 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2004-12-22 11:04:44 +0000 |
commit | 76a56260628e949cd60b00f8035a53cbadca61ad (patch) | |
tree | ddf7940b89fa9f07f0e100925f8a8f01d594693d /binutils/readelf.c | |
parent | 911a63006ce7686ef257250e1e0c4f960791d79b (diff) | |
download | gdb-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.c | 53 |
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) |