This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Commit: Use reloc_at to detect partial debug_line sections
- From: Nick Clifton <nickc at redhat dot com>
- To: binutils at sourceware dot org
- Date: Fri, 05 Jun 2015 16:59:32 +0100
- Subject: Commit: Use reloc_at to detect partial debug_line sections
- Authentication-results: sourceware.org; auth=none
Hi Guys,
I am checking in the patch below to fix the heuristic in
read_debug_line_header that detect partial .debug_line sections.
Previously it used to check for a negative length, but this is not
guaranteed to happen. (It depends upon the relocs used to compute the
correct values for the debug_line header). Instead we can now use the
reloc_at function to detect that a reloc is needed to compute the
correct header length, and take the appropriate steps.
Tested with no regressions on lots of toolchains.
Cheers
Nick
binutils/ChangeLog
2015-06-05 Nick Clifton <nickc@redhat.com>
* dwarf.c (read_debug_line_header): Use reloc_at to detect
incomplete .debug_line headers
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;
}
}