diff options
author | Nick Clifton <nickc@redhat.com> | 2015-06-05 16:58:35 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2015-06-05 16:58:35 +0100 |
commit | 8fcc61b42be7703460dcacf24d97b290f502c23e (patch) | |
tree | bd6428c9ee919ee4a5deab026379de70ac296968 /binutils/dwarf.c | |
parent | e00a2fbc249c540593baef120eb13ea2ca7891f3 (diff) | |
download | gdb-8fcc61b42be7703460dcacf24d97b290f502c23e.zip gdb-8fcc61b42be7703460dcacf24d97b290f502c23e.tar.gz gdb-8fcc61b42be7703460dcacf24d97b290f502c23e.tar.bz2 |
Improves the detection of partial .debug_line sections.
* dwarf.c (read_debug_line_header): Use reloc_at to detect
incomplete .debug_line headers
Diffstat (limited to 'binutils/dwarf.c')
-rw-r--r-- | binutils/dwarf.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/binutils/dwarf.c b/binutils/dwarf.c index 71b0e97..c3dc814 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -2761,18 +2761,20 @@ read_debug_line_header (struct dwarf_section * section, if (linfo->li_length + initial_length_size > section->size) { - /* If the length is just a bias against the initial_length_size then - this means that the field has a relocation against it which has not - been applied. (Ie we are dealing with an object file, not a linked - binary). Do not complain but instead assume that the rest of the - section applies to this particular header. */ - if (linfo->li_length == - initial_length_size) + /* If the length field has a relocation against it, then we should + not complain if it is inaccurate (and probably negative). This + happens in object files when the .debug_line section is actually + comprised of several different .debug_line.* sections, (some of + which may be removed by linker garbage collection), and a relocation + is used to compute the correct length once that is done. */ + if (reloc_at (section, (hdrptr - section->start) - offset_size)) { - linfo->li_length = section->size - initial_length_size; + linfo->li_length = (end - data) - initial_length_size; } else { - warn (_("The line info appears to be corrupt - the section is too small\n")); + warn (_("The length field (0x%lx) in the debug_line header is wrong - the section is too small\n"), + (long) linfo->li_length); return NULL; } } |