This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: Avoid coff OOM
- From: Alan Modra <amodra at gmail dot com>
- To: binutils at sourceware dot org
- Date: Wed, 12 Nov 2014 15:13:21 +1030
- Subject: Re: Avoid coff OOM
- Authentication-results: sourceware.org; auth=none
- References: <20141111120210 dot GB21684 at bubble dot grove dot modra dot org>
On Tue, Nov 11, 2014 at 10:32:10PM +1030, Alan Modra wrote:
> Nick, I'm not sure whether throwing away the function entries in the
> line table when you hit a bad symbol is a good idea. Doing that
> mashes any following line number entries into the previous function.
> Perhaps throw them away too, until you hit the next good function
> entry?
Like this.
PR 17521
* coffcode.h (coff_slurp_line_table): Drop line number info
not preceded by a valid function entry. Revert last change.
diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index 4bc80bd..acc7360 100644
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -4513,6 +4513,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
int ordered = 1;
unsigned int nbr_func;
LINENO *src;
+ bfd_boolean have_func;
BFD_ASSERT (asect->lineno == NULL);
@@ -4535,6 +4536,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
asect->lineno = lineno_cache;
src = native_lineno;
nbr_func = 0;
+ have_func = FALSE;
for (counter = 0; counter < asect->lineno_count; counter++, src++)
{
@@ -4552,6 +4554,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
bfd_vma symndx;
coff_symbol_type *sym;
+ have_func = FALSE;
symndx = dst.l_addr.l_symndx;
if (symndx >= obj_raw_syment_count (abfd))
{
@@ -4577,6 +4580,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
continue;
}
+ have_func = TRUE;
nbr_func++;
cache_ptr->u.sym = (asymbol *) sym;
if (sym->lineno != NULL)
@@ -4589,6 +4593,10 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
ordered = 0;
prev_offset = sym->symbol.value;
}
+ else if (!have_func)
+ /* Drop line information that has no associated function.
+ PR 17521: file: 078-10659-0.004. */
+ continue;
else
cache_ptr->u.offset = (dst.l_addr.l_paddr
- bfd_section_vma (abfd, asect));
@@ -4642,15 +4650,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
*n_cache_ptr++ = *old_ptr++;
while (old_ptr->line_number != 0);
}
- /* PR 17521: file: 078-10659-0.004. */
- if (n_cache_ptr < n_lineno_cache + asect->lineno_count)
- {
- amt = n_cache_ptr - n_lineno_cache;
- memcpy (lineno_cache, n_lineno_cache, amt * sizeof (alent));
- memset (lineno_cache + amt, 0, (asect->lineno_count - amt) * sizeof (alent));
- }
- else
- memcpy (lineno_cache, n_lineno_cache, amt);
+ memcpy (lineno_cache, n_lineno_cache, amt);
}
bfd_release (abfd, func_table);
}
--
Alan Modra
Australia Development Lab, IBM