[PATCH,plugins,head+2.21] Handle COMDAT groups on ELF.
H.J. Lu
hjl.tools@gmail.com
Sat May 7 15:06:00 GMT 2011
On Sat, May 7, 2011 at 7:52 AM, Dave Korn <dave.korn.cygwin@gmail.com> wrote:
>
> Hi again,
>
> One of the advantages of the two-stage-link tear-down-and-rebuild approach
> was that we got COMDAT group selection correct for free, as a consequence of
> resetting the already-linked table. Since we're not doing that now, we have
> to handle COMDAT in the linker plugin code by creating synthetic .group
> sections in the dummy IR BFD, but making sure that these sections don't
> actually win in group selection decisions.
>
> That's what this patch implements, and on x86_64-linux, with this, we now
> get a completely clean GCC testrun (entire c-family and fortran), which brings
> ld.bfd into parity with ld.gold. :-)
>
> bfd/ChangeLog:
>
> 2011-05-07 Dave Korn <dave.korn.cygwin@...
>
> * elflink.c (elf_link_add_object_symbols): Don't mark symbols undef
> when the kept section comes from a plugin BFD that we expect to be
> replaced later.
> (_bfd_elf_section_already_linked): When there is a duplicate section,
> but the initial kept section comes from a plugin BFD and the newer
> duplicate section does not, keep the newer one and discard the initial
> kept section.
>
> ld/ChangeLog:
>
> * plugin.c (struct group_sec_hash_table): New derived hash table type.
> (struct group_sec_hash_entry): Derived entry type for the above.
> (group_sec_hash_newfunc): Derived ctor for the table entries creates
> an ELF comdat group section with the given signature.
> (init_group_sec_hash_table): Derived ctor for the table.
> (group_sec_hash_lookup): Derived lookup function.
> (group_sec_hash_traverse): Derived traverse function.
> (group_sec_hash_table_free): Derived dtor.
> (struct add_syms_info): Helper struct to wrap args to callback.
> (get_elf_comdat_section): New helper function for ELF targets.
> (get_comdat_section): Likewise for all targets.
> (asymbol_from_plugin_symbol): Take an add_syms_info rather than a
> bfd pointer argument and adjust usage accordingly. Generate comdat
> sections or groups for defined symbols with non-NULL comdat_key.
> (add_symbols): Wrap parameters to pass down in an add_syms_info, and
> handle ELF comdat group section creation.
>
> Tested on x86_64-unknown-linux-gnu as mentioned. I'm going to start running
> a GCC testsuite on i686-pc-cygwin, but that could take a couple of days for
> the final results to come in. If this patch is OK, I'll wait until that's got
> far enough to be sure it's working before I commit.
>
> Any comments on the implementation, while we're waiting? Or OK as it is?
>
Do you have a testcase to show it fails without your change?
Thanks.
--
H.J.
More information about the Binutils
mailing list