1999-09-11 Donn Terry <donn@interix.com>

* cofflink.c (_bfd_coff_link_input_bfd): If a symbol is stripped,
	don't write out the associated line numbers.
This commit is contained in:
Ian Lance Taylor 1999-09-11 21:27:15 +00:00
parent 2c546cd84f
commit b545f675c1
2 changed files with 27 additions and 9 deletions

View File

@ -5,6 +5,9 @@
1999-09-11 Donn Terry <donn@interix.com>
* cofflink.c (_bfd_coff_link_input_bfd): If a symbol is stripped,
don't write out the associated line numbers.
* cofflink.c (_bfd_coff_write_global_sym): Handle section symbol
aux entries.

View File

@ -2025,6 +2025,8 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
bfd_vma offset;
bfd_byte *eline;
bfd_byte *elineend;
bfd_byte *oeline;
boolean skipping;
/* FIXME: If SEC_HAS_CONTENTS is not for the section, then
build_link_order in ldwrite.c will not have created a
@ -2046,7 +2048,9 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
offset = o->output_section->vma + o->output_offset - o->vma;
eline = finfo->linenos;
oeline = finfo->linenos;
elineend = eline + linesz * o->lineno_count;
skipping = false;
for (; eline < elineend; eline += linesz)
{
struct internal_lineno iline;
@ -2066,11 +2070,13 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
if (indx < 0)
{
/* These line numbers are attached to a symbol
which we are stripping. We should really
just discard the line numbers, but that would
be a pain because we have already counted
them. */
indx = 0;
which we are stripping. We must discard the
line numbers because reading them back with
no associated symbol (or associating them all
with symbol #0) will fail. We can't regain
the space in the output file, but at least
they're dense. */
skipping = true;
}
else
{
@ -2109,23 +2115,32 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
is.n_type, is.n_sclass, 0,
is.n_numaux, auxptr);
}
skipping = false;
}
iline.l_addr.l_symndx = indx;
}
bfd_coff_swap_lineno_out (output_bfd, (PTR) &iline, (PTR) eline);
if (!skipping)
{
bfd_coff_swap_lineno_out (output_bfd, (PTR) &iline,
(PTR) oeline);
oeline += linesz;
}
}
if (bfd_seek (output_bfd,
(o->output_section->line_filepos
+ o->output_section->lineno_count * linesz),
SEEK_SET) != 0
|| bfd_write (finfo->linenos, linesz, o->lineno_count,
output_bfd) != linesz * o->lineno_count)
|| (bfd_write (finfo->linenos, 1, oeline - finfo->linenos,
output_bfd)
!= (bfd_size_type) (oeline - finfo->linenos)))
return false;
o->output_section->lineno_count += o->lineno_count;
o->output_section->lineno_count +=
(oeline - finfo->linenos) / linesz;
}
}