Check if __start/__stop symbols are referenced by shared objects
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 31 Jan 2018 13:10:40 +0000 (05:10 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 31 Jan 2018 13:10:53 +0000 (05:10 -0800)
Define  __start/__stop symbols if they are referenced by shared objects,
not if they are also defined in shared objects.

bfd/

PR ld/21964
* elflink.c (bfd_elf_define_start_stop): Check if __start and
__stop symbols are referenced by shared objects.

ld/

PR ld/21964
* testsuite/ld-elf/pr21964-4.c: New file.
* testsuite/ld-elf/shared.exp: Run pr21964-4 test on Linux.

bfd/ChangeLog
bfd/elflink.c
ld/ChangeLog
ld/testsuite/ld-elf/pr21964-4.c [new file with mode: 0644]
ld/testsuite/ld-elf/shared.exp

index fb93985..2a0330c 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-31  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/21964
+       * elflink.c (bfd_elf_define_start_stop): Check if __start and
+       __stop symbols are referenced by shared objects.
+
 2018-01-30  Alan Modra  <amodra@gmail.com>
 
        PR 22758
index f1ec880..3787c85 100644 (file)
@@ -14338,7 +14338,7 @@ bfd_elf_define_start_stop (struct bfd_link_info *info,
   if (h != NULL
       && (h->root.type == bfd_link_hash_undefined
          || h->root.type == bfd_link_hash_undefweak
-         || ((h->ref_regular || h->def_dynamic) && !h->def_regular)))
+         || ((h->ref_regular || h->ref_dynamic) && !h->def_regular)))
     {
       h->root.type = bfd_link_hash_defined;
       h->root.u.def.section = sec;
@@ -14358,7 +14358,7 @@ bfd_elf_define_start_stop (struct bfd_link_info *info,
        {
          if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
            h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_PROTECTED;
-         if (h->ref_dynamic || h->def_dynamic)
+         if (h->ref_dynamic)
            bfd_elf_link_record_dynamic_symbol (info, h);
        }
       return &h->root;
index f29d51a..67e29b9 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-31  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/21964
+       * testsuite/ld-elf/pr21964-4.c: New file.
+       * testsuite/ld-elf/shared.exp: Run pr21964-4 test on Linux.
+
 2018-01-30  Alan Modra  <amodra@gmail.com>
 
        * testsuite/ld-gc/stop.d,
diff --git a/ld/testsuite/ld-elf/pr21964-4.c b/ld/testsuite/ld-elf/pr21964-4.c
new file mode 100644 (file)
index 0000000..d50c148
--- /dev/null
@@ -0,0 +1,22 @@
+#define _GNU_SOURCE
+#include <dlfcn.h>
+#include <stdio.h>
+
+extern int __start___verbose[];
+int bar (void)
+{
+  static int my_var __attribute__ ((section("__verbose"), used)) = 6;
+  int *ptr;
+  ptr = (int*) dlsym (RTLD_DEFAULT, "__start___verbose");
+  if (ptr != NULL || __start___verbose[0] != 6)
+    return -1;
+  return 0;
+}
+
+int
+main ()
+{
+  if (bar () == 0)
+    printf ("PASS\n");
+  return 0;
+}
index 8223d3d..833a428 100644 (file)
@@ -1099,6 +1099,18 @@ if { [istarget *-*-linux*]
            "pr22393-2-static" \
            "pass.out" \
        ] \
+       [list \
+           "Run pr21964-4" \
+           "" \
+           "" \
+           {pr21964-4.c} \
+           "pr21964-4" \
+           "pass.out" \
+           "" \
+           "" \
+           "" \
+           "-ldl" \
+       ] \
     ]
 }