[PATCH] another discarded DWARF issue

Bob Wilson bwilson@tensilica.com
Sat Oct 6 14:44:00 GMT 2007


I'm sorry to report that I've run into another problem with DWARF debug info for 
  discarded sections.  I wholeheartedly agree with others who have expressed the 
opinion that the linker should remove DWARF entries for discarded sections, 
instead of piling on more hacks to keep it limping along.

But.... I'm not going to be able to fix it properly, at least not now, so here's 
another hack.

The problem is the Xtensa port's link-time relaxations that change the offsets 
in the code and the overall size of the sections.  There are actually 2 separate 
issues that interact.

* 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).

* Assuming that the section size comparison works and a DWARF reference to a 
discarded section is replaced by a reference to the corresponding kept section, 
the Xtensa relaxation code needs to anticipate that and adjust the offsets.

The most serious effect of these problems was reported to me in the context of a 
large C++ application for which I do not have the source code.  For whatever 
reason, the various instances of a particular linkonce section have slightly 
different sizes in different object files.  In at least one case, that size 
difference must exactly match the change in size due to relaxation of the kept 
section.  Then, the section size check in _bfd_elf_check_kept_sections matches, 
even though the sections are different, and the references to discarded code are 
changed to the kept code.  That happens after the Xtensa relaxation is finished 
and the offsets never get adjusted to account for the relaxation.  This is more 
serious than it may sound because of Xtensa's odd-sized instructions.  If the 
debug line offsets are wrong and you insert a breakpoint, that breakpoint might 
be in the middle of some other instruction and will cause a crash when it is hit.

Anyway, here is a patch to work around these problems.  It changes 
_bfd_elf_check_kept_section to compare versus the original, unrelaxed size of 
the kept section.  I'm assuming the ELF section header is the right place to get 
the original size, since sec->rawsize is not set for all relaxed sections.  Let 
me know if there's a better way.  The elf32-xtensa.c change is a bit hacky 
because _bfd_elf_check_kept_section is not exported from elflink.c, but that 
doesn't bother me -- I'm still optimistic that this will all get fixed properly 
someday.

I tested this with an xtensa-elf build with the testcase for bug2342.  I also 
tried several variations of the code to better exercise the Xtensa relaxation, 
and I manually inspected the resulting DWARF info.  I ran all the binutils 
testsuites for both xtensa-elf and i686-pc-linux-gnu builds, with no new failures.

Is this OK?  Any better ideas?

2007-10-05  Bob Wilson  <bob.wilson@acm.org>

	* elf32-xtensa.c (relax_section): Check for a reference to a discarded
	DWARF section and anticipate its replacement with the kept section.
	* elflink.c (_bfd_elf_check_kept_section): Compare against the kept
	section size from its ELF header.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: bfd-linkonce-dwarf.patch
Type: text/x-diff
Size: 2974 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20071006/3478bf15/attachment.bin>


More information about the Binutils mailing list