[PATCH] ld: Properly override the IR definition

H.J. Lu hjl.tools@gmail.com
Wed Jul 22 12:31:10 GMT 2020


On Tue, Jul 21, 2020 at 6:50 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Tue, Jul 21, 2020 at 6:01 PM Alan Modra <amodra@gmail.com> wrote:
> >
> > On Tue, Jul 21, 2020 at 06:37:31AM -0700, H.J. Lu wrote:
> > > After all LTO symbols have been read, a new definition in real object
> > > overrides the previous definition in the IR object.  Before all LTO
> > > symbols have been read, a new non-weak definition overrides the weak
> > > definition in the IR object.
> > >
> > > OK for master?
> >
> > diff --git a/ld/plugin.c b/ld/plugin.c
> > index b455af6d67..ff9f00e452 100644
> > --- a/ld/plugin.c
> > +++ b/ld/plugin.c
> > @@ -1433,12 +1433,20 @@ plugin_notice (struct bfd_link_info *info,
> >          new value from a real BFD.  Weak symbols are not normally
> >          overridden by a new weak definition, and strong symbols
> >          will normally cause multiple definition errors.  Avoid
> > -        this by making the symbol appear to be undefined.  */
> > -      else if (((h->type == bfd_link_hash_defweak
> > -                || h->type == bfd_link_hash_defined)
> > -               && is_ir_dummy_bfd (sym_bfd = h->u.def.section->owner))
> > -              || (h->type == bfd_link_hash_common
> > -                  && is_ir_dummy_bfd (sym_bfd = h->u.c.p->section->owner)))
> > +        this by making the symbol appear to be undefined.
> > +
> > +        NB: After all LTO symbols have been read, a new definition in
> > +        real object overrides the previous definition in the IR object.
> > +        Before all LTO symbols have been read, a new non-weak definition
> > +        overrides the weak definition in the IR object.  */
> > +      else if ((((h->type == bfd_link_hash_defweak
> > +                 || h->type == bfd_link_hash_defined)
> > +                && is_ir_dummy_bfd (sym_bfd = h->u.def.section->owner))
> > +               || (h->type == bfd_link_hash_common
> > +                   && is_ir_dummy_bfd (sym_bfd = h->u.c.p->section->owner)))
> > +              && (info->lto_all_symbols_read
> > +                  || ((flags & BSF_WEAK) == 0
> > +                      && h->type == bfd_link_hash_defweak)))
> >         {
> >           h->type = bfd_link_hash_undefweak;
> >           h->u.undef.abfd = sym_bfd;
> >
> > Can't this just be the following, since non-weak will override weak
> > without any changes to h->type here?
> >
> >       else if ((((h->type == bfd_link_hash_defweak
> >                   || h->type == bfd_link_hash_defined)
> >                  && is_ir_dummy_bfd (sym_bfd = h->u.def.section->owner))
> >                 || (h->type == bfd_link_hash_common
> >                     && is_ir_dummy_bfd (sym_bfd = h->u.c.p->section->owner)))
> >                && info->lto_all_symbols_read)
> >
> > OK with that simplification, if you have tested your patch with a gcc
> > regression test.
>
> I am testing this patch with GCC regression test.  I will check it in if there
> are no regressions.
>

Hi Nick,

Is it OK for 2.35 branch?


-- 
H.J.


More information about the Binutils mailing list