ld: Keep indirect symbol from IR if referenced from shared object

Don't change indirect symbol defined in IR to undefined if it is
referenced from shared object.

bfd/

	PR ld/28879
	* elflink.c (_bfd_elf_merge_symbol): Don't change indirect
	symbol defined in IR to undefined if it is referenced from
	shared object.

ld/

	PR ld/28879
	* testsuite/ld-plugin/lto.exp: Run PR ld/28879 tests.
	* testsuite/ld-plugin/pr28879a.cc: New file.
	* testsuite/ld-plugin/pr28879b.cc: Likewise.
This commit is contained in:
H.J. Lu
2022-02-11 15:13:19 -08:00
parent bb88f10425
commit 20ea3acc72
4 changed files with 43 additions and 3 deletions

View File

@@ -1294,9 +1294,8 @@ _bfd_elf_merge_symbol (bfd *abfd,
h->root.non_ir_ref_dynamic = true;
hi->root.non_ir_ref_dynamic = true;
}
if ((oldbfd->flags & BFD_PLUGIN) != 0
&& hi->root.type == bfd_link_hash_indirect)
else if ((oldbfd->flags & BFD_PLUGIN) != 0
&& hi->root.type == bfd_link_hash_indirect)
{
/* Change indirect symbol from IR to undefined. */
hi->root.type = bfd_link_hash_undefined;

View File

@@ -471,6 +471,32 @@ set lto_link_elf_tests [list \
[list {pr27441c.so} \
{-shared -fPIC -Wl,--as-needed tmpdir/pr27441c.o tmpdir/pr27441b.so tmpdir/pr27441a.so} {-fPIC} \
{dummy.c} {{readelf {-dW} pr27441c.d}} {pr27441c.so}] \
[list \
"Build libpr28879a.so" \
"-shared" \
"-O0 -fpic" \
{pr28879a.cc} \
{} \
"libpr28879a.so" \
"c++" \
] \
[list \
"Build libpr28879b.so" \
"-shared -Wl,--no-as-needed tmpdir/libpr28879a.so" \
"-O2 -fpic" \
{dummy.c} \
{} \
"libpr28879b.so" \
] \
[list \
"Build pr28879" \
"-Wl,--no-as-needed tmpdir/libpr28879b.so -Wl,-rpath-link,." \
"-O0 -flto -D_GLIBCXX_ASSERTIONS" \
{pr28879b.cc} \
{} \
"pr28879" \
"c++" \
] \
]
# PR 14918 checks that libgcc is not spuriously included in a shared link of

View File

@@ -0,0 +1,7 @@
#include <string>
void
func (std::string *s)
{
delete s;
}

View File

@@ -0,0 +1,8 @@
#include <string>
int
main (void)
{
std::string header;
return 0;
}