.eh_frame optimization question

Jie Zhang jzhang918@gmail.com
Wed Jan 3 09:55:00 GMT 2007


On 1/3/07, Alan Modra <amodra@bigpond.net.au> wrote:
>
> > The currently
> > issue is that if the whole .eh_frame section is removed, it does not
> > get a chance to call _bfinfdpic_add_dyn_reloc for all of its
> > relocations. Thus its dynamic relocations are not changed to R_*_NONE
> > type.
>
> Hmm, but you alloc the reloc section contents with bfd_zalloc, don't
> you?  So you shouldn't need to change anything.
>
Yes. it's true we don't change them explicitly to R_*_NONE. The tricky
part of this bug of bfin port is the following assert which is at the
beginning of elf32_bfinfdpic_finish_dynamic_sections.

      BFD_ASSERT (bfinfdpic_gotrel_section (info)->size
		  == (bfinfdpic_gotrel_section (info)->reloc_count
		      * sizeof (Elf32_External_Rel)));

bfinfdpic_gotrel_section (info)->size is calculated by
bfinfdpic_check_relocs and bfinfdpic_gc_sweep_hook.
bfinfdpic_check_relocs increments the counts of various types of
relocations for each section of each bfd. bfinfdpic_gc_sweep_hook
decrements the counts if some sections are garbage collected. These
counts are used by size_dynamic_sections to calculate the size of
gotrel section.

bfinfdpic_gotrel_section (info)->reloc_count is calculated in
bfinfdpic_relocate_section. When _bfinfdpic_add_dyn_reloc is called
for each dynamic relocation, reloc_count is incremented by 1.

This assert assures both calculations are equal and catches nontrivial
bugs early.

When come to this specific bug, the relocation of the
going-to-be-removed .eh_frame is counted in bfinfdpic_check_relocs.
Since it's not remove by garbage collection, it's count not
decremented by bfinfdpic_gc_sweep_hook. Then the .eh_frame is
optimized away since all its entries have been removed. Thus
bfinfdpic_relocate_section cannot see this .eh_frame section and it's
relocations are not counted. The assert bangs!

My patch just make that assert happy in such situation. Removing that
assert (and another check) also works, i.e. But I don't like to do so.
Keeping these checks will make debugging easier.


Jie



More information about the Binutils mailing list