[Proposed patch] Huge performance regression in ld -r since binutils >= 2.21

Alan Modra amodra@gmail.com
Tue Nov 10 09:17:00 GMT 2015

On Tue, Nov 10, 2015 at 12:24:32AM -0800, H.J. Lu wrote:
> On Mon, Nov 9, 2015 at 10:51 PM, Alan Modra <amodra@gmail.com> wrote:
> > On Mon, Nov 09, 2015 at 10:04:42AM +0100, Romain Geissler wrote:
> >> Indeed, much better idea. I will use your patch and apply it to x86/64 as
> >> well.
> >
> > On checking I found I'd made a mistake in the previous patch, so
> > decided to go with the safer approach of copying relocs at the end of
> > the loop.  Also, I'm not renaming "rel" to "rrel".
> >
> >         * elf64-ppc.c (ppc64_elf_relocate_section): Use read and write
> >         pointers to reloc array, rather than memmove when deleting a
> >         reloc.  Don't use RELOC_AGAINST_DISCARDED_SECTION.  Adjust
> >         reloc counts at end of loop.
> >         * elf32-ppc.c (ppc_elf_relocate_section): Likewise.
> >
> I checked in a similar, but a little different, patch to fix i386 and
> x86-64.

You deleted a comment line, and need to look at all the "continue"
statements.  I see one that must copy relocs, and more that should
copy *or* you should remove the copying code at the end of the loop.

To clarify, I decided to add what is dead code to the powerpc backend
in case we ever remove relocs when !relocatable.  The only copying
that is really needed is this one:

      if (bfd_link_relocatable (info))
	  if (wrel != rel)
	    *wrel = *rel;

and you need to add the missing VTINHERIT/VTENTRY copy..

Alan Modra
Australia Development Lab, IBM

More information about the Binutils mailing list