* [PATCH] ld: Ignore the new weak definition if needed
@ 2020-07-20 13:34 H.J. Lu
2020-07-20 23:16 ` Alan Modra
0 siblings, 1 reply; 8+ messages in thread
From: H.J. Lu @ 2020-07-20 13:34 UTC (permalink / raw)
To: binutils
Ignore the new weak definition if the old definition comes from the LTO
IR object since plugin_notice will turn it into undefweak.
bfd/
PR ld/26262
* elflink.c (_bfd_elf_merge_symbol): Ignore the new weak
definition if the old definition comes from the LTO IR object.
ld/
PR ld/26262
* testsuite/ld-plugin/lto.exp: Run PR ld/26262 test.
* testsuite/ld-plugin/pr26262a.c: New file.
* testsuite/ld-plugin/pr26262b.c: Likewise.
* testsuite/ld-plugin/pr26262c.c: Likewise.
* testsuite/ld-plugin/pr26262d.c: Likewise.
---
bfd/elflink.c | 12 ++++++++++++
ld/testsuite/ld-plugin/lto.exp | 11 +++++++++++
ld/testsuite/ld-plugin/pr26262a.c | 17 +++++++++++++++++
ld/testsuite/ld-plugin/pr26262b.c | 5 +++++
ld/testsuite/ld-plugin/pr26262c.c | 16 ++++++++++++++++
ld/testsuite/ld-plugin/pr26262d.c | 6 ++++++
6 files changed, 67 insertions(+)
create mode 100644 ld/testsuite/ld-plugin/pr26262a.c
create mode 100644 ld/testsuite/ld-plugin/pr26262b.c
create mode 100644 ld/testsuite/ld-plugin/pr26262c.c
create mode 100644 ld/testsuite/ld-plugin/pr26262d.c
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 286fc11250..15d25d52d9 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -1269,6 +1269,18 @@ _bfd_elf_merge_symbol (bfd *abfd,
&& h->root.type != bfd_link_hash_undefweak
&& h->root.type != bfd_link_hash_common);
+ /* NB: Ignore the new weak definition if the old definition comes
+ from the LTO IR object since plugin_notice will turn it into
+ undefweak. */
+ if (olddef
+ && oldbfd
+ && (oldbfd->flags & BFD_PLUGIN) != 0
+ && newweak)
+ {
+ *skip = TRUE;
+ return TRUE;
+ }
+
/* NEWFUNC and OLDFUNC indicate whether the new or old symbol,
respectively, appear to be a function. */
diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
index 2d6ca6888b..3b9f8d4c5d 100644
--- a/ld/testsuite/ld-plugin/lto.exp
+++ b/ld/testsuite/ld-plugin/lto.exp
@@ -384,6 +384,12 @@ set lto_link_elf_tests [list \
"-shared -Wl,--exclude-libs,ALL tmpdir/pr25618a.o tmpdir/pr25618.a" \
"-fpic" \
{dummy.c} {{readelf {--dyn-syms --wide} pr25618.d}} "pr25618.so" "c++"] \
+ [list "Build pr26262c.o" \
+ "" "-O2 -fpic" \
+ {pr26262c.c} {} "" "c"] \
+ [list "Build pr26262d.o" \
+ "" "-O2 -fpic" \
+ {pr26262d.c} {} "" "c"] \
]
# PR 14918 checks that libgcc is not spuriously included in a shared link of
@@ -510,6 +516,11 @@ set lto_run_tests [list \
{pr26163b.c} "pr24406-2" "pass.out" \
"-flto -O2" "c" "" \
"tmpdir/pr26163a.o -Wl,--defsym,g=real_g"] \
+ [list "Run pr26262" \
+ "-O2 -flto" "" \
+ {pr26262a.c pr26262b.c} "pr26262" "pass.out" \
+ "-flto -O2" "c" "" \
+ "tmpdir/pr26262c.o tmpdir/pr26262d.o"] \
]
if { [at_least_gcc_version 4 7] } {
diff --git a/ld/testsuite/ld-plugin/pr26262a.c b/ld/testsuite/ld-plugin/pr26262a.c
new file mode 100644
index 0000000000..b1867cd578
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr26262a.c
@@ -0,0 +1,17 @@
+#include <stdio.h>
+
+int counter;
+extern void foo (void);
+extern void bar (void);
+extern void xxx (void);
+
+int
+main(void)
+{
+ bar ();
+ foo ();
+ xxx ();
+ if (counter == 1)
+ printf ("PASS\n");
+ return 0;
+}
diff --git a/ld/testsuite/ld-plugin/pr26262b.c b/ld/testsuite/ld-plugin/pr26262b.c
new file mode 100644
index 0000000000..177e69c01e
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr26262b.c
@@ -0,0 +1,5 @@
+__attribute__ ((noinline))
+void
+bar (void)
+{
+}
diff --git a/ld/testsuite/ld-plugin/pr26262c.c b/ld/testsuite/ld-plugin/pr26262c.c
new file mode 100644
index 0000000000..91ec492ac7
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr26262c.c
@@ -0,0 +1,16 @@
+#include <stdlib.h>
+
+extern int counter;
+
+void
+foo (void)
+{
+ counter++;
+}
+
+__attribute__((weak))
+void
+bar (void)
+{
+ abort ();
+}
diff --git a/ld/testsuite/ld-plugin/pr26262d.c b/ld/testsuite/ld-plugin/pr26262d.c
new file mode 100644
index 0000000000..fcc4941125
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr26262d.c
@@ -0,0 +1,6 @@
+extern void bar (void);
+void
+xxx (void)
+{
+ bar ();
+}
--
2.26.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] ld: Ignore the new weak definition if needed
2020-07-20 13:34 [PATCH] ld: Ignore the new weak definition if needed H.J. Lu
@ 2020-07-20 23:16 ` Alan Modra
2020-07-20 23:22 ` H.J. Lu
0 siblings, 1 reply; 8+ messages in thread
From: Alan Modra @ 2020-07-20 23:16 UTC (permalink / raw)
To: H.J. Lu; +Cc: binutils
On Mon, Jul 20, 2020 at 06:34:29AM -0700, H.J. Lu via Binutils wrote:
> --- a/bfd/elflink.c
> +++ b/bfd/elflink.c
> @@ -1269,6 +1269,18 @@ _bfd_elf_merge_symbol (bfd *abfd,
> && h->root.type != bfd_link_hash_undefweak
> && h->root.type != bfd_link_hash_common);
>
> + /* NB: Ignore the new weak definition if the old definition comes
> + from the LTO IR object since plugin_notice will turn it into
> + undefweak. */
> + if (olddef
> + && oldbfd
> + && (oldbfd->flags & BFD_PLUGIN) != 0
> + && newweak)
> + {
> + *skip = TRUE;
> + return TRUE;
> + }
> +
> /* NEWFUNC and OLDFUNC indicate whether the new or old symbol,
> respectively, appear to be a function. */
>
How do you square this with later code in _bfd_elf_merge_symbol?
See PR12696.
/* Skip weak definitions of symbols that are already defined. */
if (newdef && olddef && newweak)
{
/* Don't skip new non-IR weak syms. */
if (!(oldbfd != NULL
&& (oldbfd->flags & BFD_PLUGIN) != 0
&& (abfd->flags & BFD_PLUGIN) == 0))
{
newdef = FALSE;
*skip = TRUE;
}
--
Alan Modra
Australia Development Lab, IBM
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] ld: Ignore the new weak definition if needed
2020-07-20 23:16 ` Alan Modra
@ 2020-07-20 23:22 ` H.J. Lu
2020-07-21 13:37 ` [PATCH] ld: Properly override the IR definition H.J. Lu
0 siblings, 1 reply; 8+ messages in thread
From: H.J. Lu @ 2020-07-20 23:22 UTC (permalink / raw)
To: Alan Modra; +Cc: Binutils
On Mon, Jul 20, 2020 at 4:17 PM Alan Modra <amodra@gmail.com> wrote:
>
> On Mon, Jul 20, 2020 at 06:34:29AM -0700, H.J. Lu via Binutils wrote:
> > --- a/bfd/elflink.c
> > +++ b/bfd/elflink.c
> > @@ -1269,6 +1269,18 @@ _bfd_elf_merge_symbol (bfd *abfd,
> > && h->root.type != bfd_link_hash_undefweak
> > && h->root.type != bfd_link_hash_common);
> >
> > + /* NB: Ignore the new weak definition if the old definition comes
> > + from the LTO IR object since plugin_notice will turn it into
> > + undefweak. */
> > + if (olddef
> > + && oldbfd
> > + && (oldbfd->flags & BFD_PLUGIN) != 0
> > + && newweak)
> > + {
> > + *skip = TRUE;
> > + return TRUE;
> > + }
> > +
> > /* NEWFUNC and OLDFUNC indicate whether the new or old symbol,
> > respectively, appear to be a function. */
> >
>
> How do you square this with later code in _bfd_elf_merge_symbol?
> See PR12696.
>
> /* Skip weak definitions of symbols that are already defined. */
> if (newdef && olddef && newweak)
> {
> /* Don't skip new non-IR weak syms. */
> if (!(oldbfd != NULL
> && (oldbfd->flags & BFD_PLUGIN) != 0
> && (abfd->flags & BFD_PLUGIN) == 0))
> {
> newdef = FALSE;
> *skip = TRUE;
> }
>
My patch is wrong.
--
H.J.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH] ld: Properly override the IR definition
2020-07-20 23:22 ` H.J. Lu
@ 2020-07-21 13:37 ` H.J. Lu
2020-07-22 1:01 ` Alan Modra
0 siblings, 1 reply; 8+ messages in thread
From: H.J. Lu @ 2020-07-21 13:37 UTC (permalink / raw)
To: Alan Modra; +Cc: Binutils
[-- Attachment #1: Type: text/plain, Size: 1737 bytes --]
On Mon, Jul 20, 2020 at 4:22 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Mon, Jul 20, 2020 at 4:17 PM Alan Modra <amodra@gmail.com> wrote:
> >
> > On Mon, Jul 20, 2020 at 06:34:29AM -0700, H.J. Lu via Binutils wrote:
> > > --- a/bfd/elflink.c
> > > +++ b/bfd/elflink.c
> > > @@ -1269,6 +1269,18 @@ _bfd_elf_merge_symbol (bfd *abfd,
> > > && h->root.type != bfd_link_hash_undefweak
> > > && h->root.type != bfd_link_hash_common);
> > >
> > > + /* NB: Ignore the new weak definition if the old definition comes
> > > + from the LTO IR object since plugin_notice will turn it into
> > > + undefweak. */
> > > + if (olddef
> > > + && oldbfd
> > > + && (oldbfd->flags & BFD_PLUGIN) != 0
> > > + && newweak)
> > > + {
> > > + *skip = TRUE;
> > > + return TRUE;
> > > + }
> > > +
> > > /* NEWFUNC and OLDFUNC indicate whether the new or old symbol,
> > > respectively, appear to be a function. */
> > >
> >
> > How do you square this with later code in _bfd_elf_merge_symbol?
> > See PR12696.
> >
> > /* Skip weak definitions of symbols that are already defined. */
> > if (newdef && olddef && newweak)
> > {
> > /* Don't skip new non-IR weak syms. */
> > if (!(oldbfd != NULL
> > && (oldbfd->flags & BFD_PLUGIN) != 0
> > && (abfd->flags & BFD_PLUGIN) == 0))
> > {
> > newdef = FALSE;
> > *skip = TRUE;
> > }
> >
>
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?
Thanks.
--
H.J.
[-- Attachment #2: 0001-ld-Properly-override-the-IR-definition.patch --]
[-- Type: application/x-patch, Size: 8723 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] ld: Properly override the IR definition
2020-07-21 13:37 ` [PATCH] ld: Properly override the IR definition H.J. Lu
@ 2020-07-22 1:01 ` Alan Modra
2020-07-22 1:50 ` H.J. Lu
0 siblings, 1 reply; 8+ messages in thread
From: Alan Modra @ 2020-07-22 1:01 UTC (permalink / raw)
To: H.J. Lu; +Cc: Binutils
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.
--
Alan Modra
Australia Development Lab, IBM
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] ld: Properly override the IR definition
2020-07-22 1:01 ` Alan Modra
@ 2020-07-22 1:50 ` H.J. Lu
2020-07-22 12:31 ` H.J. Lu
0 siblings, 1 reply; 8+ messages in thread
From: H.J. Lu @ 2020-07-22 1:50 UTC (permalink / raw)
To: Alan Modra; +Cc: Binutils
[-- Attachment #1: Type: text/plain, Size: 2800 bytes --]
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.
Thanks.
--
H.J.
[-- Attachment #2: 0001-ld-Properly-override-the-IR-definition.patch --]
[-- Type: text/x-patch, Size: 8386 bytes --]
From 11688640775a271feef9acbe3997c593720f602a Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Mon, 20 Jul 2020 06:00:22 -0700
Subject: [PATCH] ld: Properly override the IR definition
We change the previous definition in the IR object to undefweak only
after all LTO symbols have been read.
include/
PR ld/26262
PR ld/26267
* bfdlink.h (bfd_link_info): Add lto_all_symbols_read.
ld/
PR ld/26262
PR ld/26267
* ldlang.c (lang_process): Set lto_all_symbols_read after all
LTO IR symbols have been read.
* plugin.c (plugin_notice): Override the IR definition only if
all LTO IR symbols have been read or the new definition is
non-weak and the the IR definition is weak
* testsuite/ld-plugin/lto.exp: Run PR ld/26262 and ld/26267
tests.
* testsuite/ld-plugin/pr26262a.c: New file.
* testsuite/ld-plugin/pr26262b.c: Likewise.
* testsuite/ld-plugin/pr26262c.c: Likewise.
* testsuite/ld-plugin/pr26267.err: Likewise.
* testsuite/ld-plugin/pr26267a.c: Likewise.
* testsuite/ld-plugin/pr26267b.c: Likewise.
* testsuite/ld-plugin/pr26267c.c: Likewise.
---
include/bfdlink.h | 3 +++
ld/ldlang.c | 1 +
ld/plugin.c | 16 +++++++-----
ld/testsuite/ld-plugin/lto.exp | 40 ++++++++++++++++++++++++++++++
ld/testsuite/ld-plugin/pr26262a.c | 21 ++++++++++++++++
ld/testsuite/ld-plugin/pr26262b.c | 16 ++++++++++++
ld/testsuite/ld-plugin/pr26262c.c | 6 +++++
ld/testsuite/ld-plugin/pr26267.err | 3 +++
ld/testsuite/ld-plugin/pr26267a.c | 21 ++++++++++++++++
ld/testsuite/ld-plugin/pr26267b.c | 15 +++++++++++
ld/testsuite/ld-plugin/pr26267c.c | 6 +++++
11 files changed, 142 insertions(+), 6 deletions(-)
create mode 100644 ld/testsuite/ld-plugin/pr26262a.c
create mode 100644 ld/testsuite/ld-plugin/pr26262b.c
create mode 100644 ld/testsuite/ld-plugin/pr26262c.c
create mode 100644 ld/testsuite/ld-plugin/pr26267.err
create mode 100644 ld/testsuite/ld-plugin/pr26267a.c
create mode 100644 ld/testsuite/ld-plugin/pr26267b.c
create mode 100644 ld/testsuite/ld-plugin/pr26267c.c
diff --git a/include/bfdlink.h b/include/bfdlink.h
index 7163433383..3badfbdb19 100644
--- a/include/bfdlink.h
+++ b/include/bfdlink.h
@@ -361,6 +361,9 @@ struct bfd_link_info
/* TRUE if the LTO plugin is active. */
unsigned int lto_plugin_active: 1;
+ /* TRUE if all LTO IR symbols have been read. */
+ unsigned int lto_all_symbols_read : 1;
+
/* TRUE if global symbols in discarded sections should be stripped. */
unsigned int strip_discarded: 1;
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 2b3a5f9069..d3ed5d461e 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -7886,6 +7886,7 @@ lang_process (void)
if (plugin_call_all_symbols_read ())
einfo (_("%F%P: %s: plugin reported error after all symbols read\n"),
plugin_error_plugin ());
+ link_info.lto_all_symbols_read = TRUE;
/* Open any newly added files, updating the file chains. */
plugin_undefs = link_info.hash->undefs_tail;
open_input_bfds (*added.tail, OPEN_BFD_NORMAL);
diff --git a/ld/plugin.c b/ld/plugin.c
index b455af6d67..d709ee10fe 100644
--- a/ld/plugin.c
+++ b/ld/plugin.c
@@ -1433,12 +1433,16 @@ 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: We change the previous definition in the IR object to
+ undefweak only after all LTO symbols have been read. */
+ else if (info->lto_all_symbols_read
+ && (((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))))
{
h->type = bfd_link_hash_undefweak;
h->u.undef.abfd = sym_bfd;
diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
index 2d6ca6888b..a44b6cf4b0 100644
--- a/ld/testsuite/ld-plugin/lto.exp
+++ b/ld/testsuite/ld-plugin/lto.exp
@@ -210,6 +210,36 @@ set lto_link_tests [list \
[list "Build pr26163a.o" \
"" "-O2 -fno-lto" \
{pr26163a.c}] \
+ [list "Build pr26262b.o" \
+ "" "-O2" \
+ {pr26262b.c} {} "" "c"] \
+ [list "Build pr26262c.o" \
+ "" "-O2" \
+ {pr26262c.c} {} "" "c"] \
+ [list "Build pr26267a.o" \
+ "" "-O2 -flto $lto_no_fat" \
+ {pr26267a.c} {} "" "c"] \
+ [list "Build pr26267b.o" \
+ "" "-O2" \
+ {pr26267b.c} {} "" "c"] \
+ [list "Build pr26267c.o" \
+ "" "-O2" \
+ {pr26267c.c} {} "" "c"] \
+ [list "Build pr26267a" \
+ "" "-O2" \
+ {pr26267a.c} {} "" "c"] \
+ [list "Build pr26267a" \
+ "-flto tmpdir/pr26267a.o tmpdir/pr26267b.o tmpdir/pr26267c.o" \
+ "-flto $lto_no_fat" \
+ {dummy.c} \
+ {{error_output "pr26267.err"}} \
+ "pr26267a"] \
+ [list "Build pr26267b" \
+ "-flto tmpdir/pr26267b.o tmpdir/pr26267c.o tmpdir/pr26267a.o" \
+ "-flto $lto_no_fat" \
+ {dummy.c} \
+ {{error_output "pr26267.err"}} \
+ "pr26267b"] \
]
if { [at_least_gcc_version 10 0] } {
@@ -510,6 +540,16 @@ set lto_run_tests [list \
{pr26163b.c} "pr24406-2" "pass.out" \
"-flto -O2" "c" "" \
"tmpdir/pr26163a.o -Wl,--defsym,g=real_g"] \
+ [list "Run pr26262a" \
+ "-O2 -flto" "" \
+ {pr26262a.c} "pr26262a" "pass.out" \
+ "-flto -O2" "c" "" \
+ "tmpdir/pr26262b.o tmpdir/pr26262c.o"] \
+ [list "Run pr26262b" \
+ "-flto -O2 tmpdir/pr26262b.o tmpdir/pr26262c.o" "" \
+ {pr26262a.c} "pr26262b" "pass.out" \
+ "-flto -O2" "c" "" \
+ ""] \
]
if { [at_least_gcc_version 4 7] } {
diff --git a/ld/testsuite/ld-plugin/pr26262a.c b/ld/testsuite/ld-plugin/pr26262a.c
new file mode 100644
index 0000000000..488470f4dd
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr26262a.c
@@ -0,0 +1,21 @@
+#include <stdio.h>
+
+int counter;
+extern void foo (void);
+extern void xxx (void);
+
+void
+bar (void)
+{
+}
+
+int
+main(void)
+{
+ bar ();
+ foo ();
+ xxx ();
+ if (counter == 1)
+ printf ("PASS\n");
+ return 0;
+}
diff --git a/ld/testsuite/ld-plugin/pr26262b.c b/ld/testsuite/ld-plugin/pr26262b.c
new file mode 100644
index 0000000000..91ec492ac7
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr26262b.c
@@ -0,0 +1,16 @@
+#include <stdlib.h>
+
+extern int counter;
+
+void
+foo (void)
+{
+ counter++;
+}
+
+__attribute__((weak))
+void
+bar (void)
+{
+ abort ();
+}
diff --git a/ld/testsuite/ld-plugin/pr26262c.c b/ld/testsuite/ld-plugin/pr26262c.c
new file mode 100644
index 0000000000..fcc4941125
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr26262c.c
@@ -0,0 +1,6 @@
+extern void bar (void);
+void
+xxx (void)
+{
+ bar ();
+}
diff --git a/ld/testsuite/ld-plugin/pr26267.err b/ld/testsuite/ld-plugin/pr26267.err
new file mode 100644
index 0000000000..b1b1c3a47d
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr26267.err
@@ -0,0 +1,3 @@
+#...
+.*: multiple definition of `bar'; .*
+#...
diff --git a/ld/testsuite/ld-plugin/pr26267a.c b/ld/testsuite/ld-plugin/pr26267a.c
new file mode 100644
index 0000000000..488470f4dd
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr26267a.c
@@ -0,0 +1,21 @@
+#include <stdio.h>
+
+int counter;
+extern void foo (void);
+extern void xxx (void);
+
+void
+bar (void)
+{
+}
+
+int
+main(void)
+{
+ bar ();
+ foo ();
+ xxx ();
+ if (counter == 1)
+ printf ("PASS\n");
+ return 0;
+}
diff --git a/ld/testsuite/ld-plugin/pr26267b.c b/ld/testsuite/ld-plugin/pr26267b.c
new file mode 100644
index 0000000000..f1e32e25e3
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr26267b.c
@@ -0,0 +1,15 @@
+#include <stdlib.h>
+
+extern int counter;
+
+void
+foo (void)
+{
+ counter++;
+}
+
+void
+bar (void)
+{
+ abort ();
+}
diff --git a/ld/testsuite/ld-plugin/pr26267c.c b/ld/testsuite/ld-plugin/pr26267c.c
new file mode 100644
index 0000000000..fcc4941125
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr26267c.c
@@ -0,0 +1,6 @@
+extern void bar (void);
+void
+xxx (void)
+{
+ bar ();
+}
--
2.26.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] ld: Properly override the IR definition
2020-07-22 1:50 ` H.J. Lu
@ 2020-07-22 12:31 ` H.J. Lu
2020-07-22 12:44 ` Nick Clifton
0 siblings, 1 reply; 8+ messages in thread
From: H.J. Lu @ 2020-07-22 12:31 UTC (permalink / raw)
To: Alan Modra, Nick Clifton; +Cc: Binutils
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.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] ld: Properly override the IR definition
2020-07-22 12:31 ` H.J. Lu
@ 2020-07-22 12:44 ` Nick Clifton
0 siblings, 0 replies; 8+ messages in thread
From: Nick Clifton @ 2020-07-22 12:44 UTC (permalink / raw)
To: H.J. Lu, Alan Modra; +Cc: Binutils
Hi H.J.
> Is it OK for 2.35 branch?
Yes it is - please go ahead and apply.
Cheers
Nick
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2020-07-22 12:44 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-20 13:34 [PATCH] ld: Ignore the new weak definition if needed H.J. Lu
2020-07-20 23:16 ` Alan Modra
2020-07-20 23:22 ` H.J. Lu
2020-07-21 13:37 ` [PATCH] ld: Properly override the IR definition H.J. Lu
2020-07-22 1:01 ` Alan Modra
2020-07-22 1:50 ` H.J. Lu
2020-07-22 12:31 ` H.J. Lu
2020-07-22 12:44 ` Nick Clifton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).