+2021-02-02 Alan Modra <amodra@gmail.com>
+
+ PR 27311
+ * elflink.c (_bfd_elf_add_default_symbol): Add override parameter.
+ Use when handling default versioned symbol. Rename existing
+ override variable to nondef_override and use for non-default
+ versioned symbol.
+ (elf_link_add_object_symbols): Adjust call to suit. Don't
+ pull in as-needed libraries when override is set.
+
2021-02-01 Emery Hemingway <ehmry@posteo.net>
* config.bfd: Add *-*-genode* as a target for AArch64 and x86.
asection *sec,
bfd_vma value,
bfd **poldbfd,
- bfd_boolean *dynsym)
+ bfd_boolean *dynsym,
+ bfd **override)
{
bfd_boolean type_change_ok;
bfd_boolean size_change_ok;
const struct elf_backend_data *bed;
bfd_boolean collect;
bfd_boolean dynamic;
- bfd *override;
+ bfd *nondef_override;
char *p;
size_t len, shortlen;
asection *tmp_sec;
matched = TRUE;
tmp_sec = sec;
if (!_bfd_elf_merge_symbol (abfd, info, shortname, sym, &tmp_sec, &value,
- &hi, poldbfd, NULL, NULL, &skip, &override,
+ &hi, poldbfd, NULL, NULL, &skip, override,
&type_change_ok, &size_change_ok, &matched))
return FALSE;
goto nondefault;
}
- if (! override)
+ if (!*override)
{
/* Add the default symbol if not performing a relocatable link. */
if (! bfd_link_relocatable (info))
size_change_ok = FALSE;
tmp_sec = sec;
if (!_bfd_elf_merge_symbol (abfd, info, shortname, sym, &tmp_sec, &value,
- &hi, poldbfd, NULL, NULL, &skip, &override,
+ &hi, poldbfd, NULL, NULL, &skip, &nondef_override,
&type_change_ok, &size_change_ok, &matched))
return FALSE;
else
return TRUE;
}
- else if (override)
+ else if (nondef_override)
{
/* Here SHORTNAME is a versioned name, so we don't expect to see
the type of override we do in the case above unless it is
&& !(hi != h
&& hi->versioned == versioned_hidden))
if (!_bfd_elf_add_default_symbol (abfd, info, h, name, isym,
- sec, value, &old_bfd, &dynsym))
+ sec, value, &old_bfd, &dynsym,
+ &override))
goto error_free_vers;
/* Check the alignment when a common symbol is involved. This
}
if (!add_needed
+ && !override
&& matched
&& definition
&& ((dynsym
+2021-02-02 Alan Modra <amodra@gmail.com>
+
+ * testsuite/ld-plugin/pr27311.d,
+ * testsuite/ld-plugin/pr27311.ver,
+ * testsuite/ld-plugin/pr27311a.c,
+ * testsuite/ld-plugin/pr27311b.c,
+ * testsuite/ld-plugin/pr27311c.c: New testcase.
+ * testsuite/ld-plugin/lto.exp: Run it. Correct PR14918 and
+ PR12982 entries.
+
2021-02-01 Emery Hemingway <ehmry@posteo.net>
* configure.tgt: Add *-*-genode* as a target for AArch64 and x86.
[list {pr26806.so} \
{-shared} {-fpic -O2 -flto} \
{pr26806.c} {{nm {-D} pr26806.d}} {pr26806.so}] \
+ [list {pr27311a.so} \
+ {-shared -Wl,--version-script=pr27311.ver} {-fPIC} \
+ {pr27311a.c} {} {pr27311a.so}] \
+ [list {pr27311b.so} \
+ {-shared -Wl,--no-as-needed tmpdir/pr27311a.so} {-fPIC} \
+ {pr27311b.c} {} {pr27311b.so}] \
+ [list {pr27311c.o} \
+ {} {-flto} \
+ {pr27311c.c} {} {} {c}] \
+ [list {pr27311} \
+ {tmpdir/pr27311c.o -Wl,--no-as-needed,--rpath-link=. tmpdir/pr27311b.so} {} \
+ {dummy.c} {{readelf {--dyn-syms --wide} pr27311.d}} {pr27311}] \
]
# PR 14918 checks that libgcc is not spuriously included in a shared link of
# __aeabi_unwind_cpp_pr0@@GCC_3.5 which is provided by libgcc_s.so.1, so the
# test fails. Hence this code to skip the test.
if { ! [istarget "arm*-*-*"] } {
- lappend lto_link_elf_tests [list \
+ lappend lto_link_elf_tests \
[list "PR ld/14918" \
"-flto" "-flto" \
- {pr14918.c} {{"readelf" {-d --wide} "pr14918.d"}} "pr14918.exe" "c"] \
- ]
+ {pr14918.c} {{"readelf" {-d --wide} "pr14918.d"}} "pr14918.exe" "c"]
}
# PR 12982 checks that an executable stack is not created by default
# executable stack for syscall restarts and signal returns, so we
# skip this test for that target.
if { ! [istarget "hppa*-*-*"] } {
- lappend lto_link_elf_tests [list \
+ lappend lto_link_elf_tests \
[list "PR ld/12982" \
"-O2 -flto -fuse-linker-plugin" "-O2 -flto" \
- {pr12982.c} {{"readelf" {-l --wide} "pr12982.d"}} "pr12982.exe"] \
- ]
+ {pr12982.c} {{"readelf" {-l --wide} "pr12982.d"}} "pr12982.exe"]
}
# Check final symbols in executables.
--- /dev/null
+#failif
+#...
+.* _*inlib1.*
+#...
--- /dev/null
+LIBFOO {
+ *;
+};
--- /dev/null
+void inlib1(void) {}
--- /dev/null
+void inlib2(void) {}
--- /dev/null
+void inlib1(void) {}
+int main()
+{
+ return 0;
+}