We really need to check for a dynamic def, not only a ref.
See added testcase.
bfd/
* elflink.c (bfd_elf_define_start_stop): Fix check of
def_dynamic.
ld/
* testsuite/ld-elf/pr21964-5.c: New test.
* testsuite/ld-elf/shared.exp: Run it.
+2018-01-31 Michael Matz <matz@suse.de>
+
+ * elflink.c (bfd_elf_define_start_stop): Fix check of
+ def_dynamic.
+
2018-01-31 H.J. Lu <hongjiu.lu@intel.com>
PR ld/21964
if (h != NULL
&& (h->root.type == bfd_link_hash_undefined
|| h->root.type == bfd_link_hash_undefweak
- || ((h->ref_regular || h->ref_dynamic) && !h->def_regular)))
+ || ((h->ref_regular || h->def_dynamic) && !h->def_regular)))
{
+ bfd_boolean was_dynamic = h->ref_dynamic || h->def_dynamic;
h->root.type = bfd_link_hash_defined;
h->root.u.def.section = sec;
h->root.u.def.value = 0;
{
if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_PROTECTED;
- if (h->ref_dynamic)
+ if (was_dynamic)
bfd_elf_link_record_dynamic_symbol (info, h);
}
return &h->root;
+2018-01-31 Michael Matz <matz@suse.de>
+
+ * testsuite/ld-elf/pr21964-5.c: New test.
+ * testsuite/ld-elf/shared.exp: Run it.
+
2018-01-31 H.J. Lu <hongjiu.lu@intel.com>
PR ld/21964
--- /dev/null
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <stdio.h>
+#include <dlfcn.h>
+
+extern int foo (void);
+
+extern int __start___verbose[];
+extern int __stop___verbose[];
+int bar (void)
+{
+ static int my_var __attribute__((section("__verbose"))) = 6;
+ int *ptr;
+ ptr = (int*) dlsym(RTLD_DEFAULT, "__start___verbose");
+ if (!ptr || *ptr != 6)
+ return -1;
+ return 0;
+}
+
+int main()
+{
+ if (bar () == 0)
+ printf ("PASS\n");
+
+ return 0;
+}
[list "Run pr21964-2" \
"-Wl,--no-as-needed,-rpath,tmpdir tmpdir/pr21964-2a.so $extralibs" "" \
{pr21964-2c.c} "pr21964-2" "pass.out" ] \
+ [list "Run pr21964-5" \
+ "-Wl,--no-as-needed,-rpath,tmpdir tmpdir/pr21964-1a.so $extralibs" "" \
+ {pr21964-5.c} "pr21964-5" "pass.out" ] \
]
# Only run them when libdl is available.