aboutsummaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2015-06-05 16:58:35 +0100
committerNick Clifton <nickc@redhat.com>2015-06-05 16:58:35 +0100
commit8fcc61b42be7703460dcacf24d97b290f502c23e (patch)
treebd6428c9ee919ee4a5deab026379de70ac296968 /binutils
parente00a2fbc249c540593baef120eb13ea2ca7891f3 (diff)
downloadgdb-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')
-rw-r--r--binutils/ChangeLog5
-rw-r--r--binutils/dwarf.c18
2 files changed, 15 insertions, 8 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 03eb240..63fefc8 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,8 @@
+2015-06-05 Nick Clifton <nickc@redhat.com>
+
+ * dwarf.c (read_debug_line_header): Use reloc_at to detect
+ incomplete .debug_line headers
+
2015-05-29 Roland McGrath <mcgrathr@google.com>
* readelf.c (print_gnu_note: NT_GNU_ABI_TAG): Recognize
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;
}
}