aboutsummaryrefslogtreecommitdiff
path: root/bfd/linker.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2024-04-08 08:16:20 +0930
committerAlan Modra <amodra@gmail.com>2024-04-08 11:27:42 +0930
commit248b6326a49ed49e2f627d3bddbac514a074bac0 (patch)
tree806188887cde0ebd7fcf9cabfec4a5558d4c3ee6 /bfd/linker.c
parent261d6a6776b6d0652eab37552450e94cb9eec780 (diff)
downloadgdb-248b6326a49ed49e2f627d3bddbac514a074bac0.zip
gdb-248b6326a49ed49e2f627d3bddbac514a074bac0.tar.gz
gdb-248b6326a49ed49e2f627d3bddbac514a074bac0.tar.bz2
Re: PR26978, Inconsistency for strong foo@v1 and weak foo@@v1
Commit 726d7d1ecf opened a hole that allowed a u.i.link loop to be created, resulting in _bfd_generic_link_add_one_symbol never returning. Fix that. Note that the MIND case handles two types of redefinition. For a new indirect symbol we'll have string non-NULL. For a new def, string will be NULL. So moving the string comparison earlier would work. However, we've already looked up inh in the first case so can dispense with name comparisons. Either way, for a new def we'll get to the defweak test and possibly cycle. Which is what we want here. PR 31615 PR 26978 * linker.c (_bfd_generic_link_add_one_symbol <MIND>): Test for exactly matching indirect symbols before cycling on a defweak.
Diffstat (limited to 'bfd/linker.c')
-rw-r--r--bfd/linker.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/bfd/linker.c b/bfd/linker.c
index eb42a78..111deec 100644
--- a/bfd/linker.c
+++ b/bfd/linker.c
@@ -1678,6 +1678,8 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info,
case MIND:
/* Multiple indirect symbols. This is OK if they both point
to the same symbol. */
+ if (h->u.i.link == inh)
+ break;
if (h->u.i.link->type == bfd_link_hash_defweak)
{
/* It is also OK to redefine a symbol that indirects to
@@ -1689,8 +1691,6 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info,
cycle = true;
break;
}
- if (string != NULL && strcmp (h->u.i.link->root.string, string) == 0)
- break;
/* Fall through. */
case MDEF:
/* Handle a multiple definition. */