This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] another discarded DWARF issue
- From: Bob Wilson <bwilson at tensilica dot com>
- To: binutils at sources dot redhat dot com
- Date: Mon, 15 Oct 2007 15:42:37 -0700
- Subject: Re: [PATCH] another discarded DWARF issue
- References: <4706C2BD.5050102@tensilica.com>
Bob Wilson wrote:
* The comparison of the kept section size in _bfd_elf_check_kept_section
does not account for changes in the section size due to linker
relaxation. You may start with a bunch of identical linkonce sections,
but only the one that is kept will be relaxed. If the kept section
changes size, the comparison will fail (or worse, match when it
shouldn't -- see below).
Replying to my own patch here.... Besides a formatting problem, I noticed that
the change to elflink.c was comparing apples and oranges. It probably doesn't
matter in practice, but I revised the patch to compare the sizes from the ELF
section headers for both sections. I'm leaving out the Xtensa-specific part of
the patch, in case that makes it easier for someone to review this piece.
I ran the testsuite with no regressions for an i686-pc-linux-gnu build, and when
combined with further changes in elf32-xtensa.c, I verified that this fixes the
problems for an xtensa-elf target with the testcase for bug 2342.
Is this OK?
2007-10-15 Bob Wilson <bob.wilson@acm.org>
* elflink.c (_bfd_elf_check_kept_section): Compare the section sizes
from the ELF headers.
Index: elflink.c
===================================================================
RCS file: /cvs/src/src/bfd/elflink.c,v
retrieving revision 1.282
diff -u -p -r1.282 elflink.c
--- elflink.c 12 Oct 2007 16:25:21 -0000 1.282
+++ elflink.c 15 Oct 2007 22:21:31 -0000
@@ -8786,7 +8786,10 @@ _bfd_elf_check_kept_section (asection *s
{
if ((kept->flags & SEC_GROUP) != 0)
kept = match_group_member (sec, kept, info);
- if (kept != NULL && sec->size != kept->size)
+ /* The kept section may have been relaxed; compare its original size. */
+ if (kept != NULL
+ && (elf_section_data (sec)->this_hdr.sh_size
+ != elf_section_data (kept)->this_hdr.sh_size))
kept = NULL;
sec->kept_section = kept;
}