MIPS ELF ld -Ur fails

Earl Chew earl_chew@agilent.com
Tue Oct 23 16:51:00 GMT 2001


"H . J . Lu" wrote:
> I looked at the code. The problem is in elf_bfd_final_link,
> elf_link_size_reloc_section is called before
> bfd_section_reloc_link_order can update
> elf_section_data(o)->rel_count.

Did you consider my patch?

Does it solve the underlying problem, or just paper over the bug?

> How should we fix it?

Regarding the nature of the problem, as I understand it, with
things the way they stand, elf_section_reloc_link_order() cannot
be called before elf_link_size_reloc_section() since the former
assumes relocation array space has been allocated by the latter.

In its current incarnation, elf_section_reloc_link_order()
not only updates elf_section_data(o)->rel_count, it also
modifies the relocation information.

This means that elf_link_size_reloc_section() must be called
before elf_section_reloc_link_order().

However, the relocation space required by elf_section_reloc_link_order()
is not accounted for when elf_link_size_reloc_section()
allocates relocation space.

If you look at the equivalent code in binutils-2.7 (which
doesn't have the bug), I think you'll find that the count was
held exclusively in o->reloc_count. Remnants of that code remain
as the first loop in elf_bfd_final_link() which updates o->reloc_count.

In binutils-2.7, o->reloc_count was used to size the relocation
area. Now, the relocation area is sized by
elf_section_data(o)->rel_count and elf_section_area(o)->rel_count2,
and I think you'll find that at the place I inserted the
BFD_ASSERT() in my patch:

        o->reloc_count != elf_section_data(o)->rel_count +
                          elf_section_data(o)->rel_count2;

In other words, the counts are inconsistent.

So, I believe that the bug is that the relocation size counts
fed to elf_link_size_reloc_section() is incorrect, and the
appropriate fix is to correct the way the counts are
maintained and updated.

Earl



More information about the Binutils mailing list