PR15530, mark symbol in executables if it matches dynamic_list
authorAlan Modra <amodra@gmail.com>
Wed, 12 Feb 2014 10:38:01 +0000 (21:08 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 12 Feb 2014 11:40:09 +0000 (22:10 +1030)
For powerpc64 as HJ did earlier for other ELF targets, and a tidy.

PR gold/15530
* elf64-ppc.c (ppc64_elf_gc_mark_dynamic_ref): Support
--export-dynamic and --dynamic-list marking of symbols.
* elflink.c (bfd_elf_gc_mark_dynamic_ref_symbol): Reorder
cheap tests first.

bfd/ChangeLog
bfd/elf64-ppc.c
bfd/elflink.c

index 2117f417159a3cb0729275d6f099099821dbb1c3..391099a6ad12b2f924adb2e9331fcf27e4f3de8b 100644 (file)
@@ -1,3 +1,11 @@
+2014-02-12  Alan Modra  <amodra@gmail.com>
+
+       PR gold/15530
+       * elf64-ppc.c (ppc64_elf_gc_mark_dynamic_ref): Support
+       --export-dynamic and --dynamic-list marking of symbols.
+       * elflink.c (bfd_elf_gc_mark_dynamic_ref_symbol): Reorder
+       cheap tests first.
+
 2014-02-10  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR gold/16530
index 9be8bfc43f84375dd781644fafe7808715a974d7..5d779616c50efa0ab2678c949e80c6ecb8a973e9 100644 (file)
@@ -6153,6 +6153,7 @@ ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
   struct bfd_link_info *info = (struct bfd_link_info *) inf;
   struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
   struct ppc_link_hash_entry *fdh;
+  struct bfd_elf_dynamic_list *d = info->dynamic_list;
 
   /* Dynamic linking info is on the func descriptor sym.  */
   fdh = defined_func_desc (eh);
@@ -6162,10 +6163,14 @@ ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
   if ((eh->elf.root.type == bfd_link_hash_defined
        || eh->elf.root.type == bfd_link_hash_defweak)
       && (eh->elf.ref_dynamic
-         || (!info->executable
-             && eh->elf.def_regular
+         || (eh->elf.def_regular
              && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
              && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
+             && (!info->executable
+                 || info->export_dynamic
+                 || (eh->elf.dynamic
+                     && d != NULL
+                     && (*d->match) (&d->head, NULL, eh->elf.root.root.string)))
              && (strchr (eh->elf.root.root.string, ELF_VER_CHR) != NULL
                  || !bfd_hide_sym_by_version (info->version_info,
                                               eh->elf.root.root.string)))))
index b1962036d6f95bbaa7f73e78240af3a64b880b78..28ccf535a79fd54123a232cf5baf2053f96c0216 100644 (file)
@@ -12145,13 +12145,14 @@ bfd_elf_gc_mark_dynamic_ref_symbol (struct elf_link_hash_entry *h, void *inf)
   if ((h->root.type == bfd_link_hash_defined
        || h->root.type == bfd_link_hash_defweak)
       && (h->ref_dynamic
-         || ((!info->executable
-              || info->export_dynamic
-              || (d != NULL
-                  && (*d->match) (&d->head, NULL, h->root.root.string)))
-             && h->def_regular
+         || (h->def_regular
              && ELF_ST_VISIBILITY (h->other) != STV_INTERNAL
              && ELF_ST_VISIBILITY (h->other) != STV_HIDDEN
+             && (!info->executable
+                 || info->export_dynamic
+                 || (h->dynamic
+                     && d != NULL
+                     && (*d->match) (&d->head, NULL, h->root.root.string)))
              && (strchr (h->root.root.string, ELF_VER_CHR) != NULL
                  || !bfd_hide_sym_by_version (info->version_info,
                                               h->root.root.string)))))