]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
2001-06-18 H.J. Lu <hjl@gnu.org>
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 18 Jun 2001 18:57:06 +0000 (18:57 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 18 Jun 2001 18:57:06 +0000 (18:57 +0000)
* elflink.h (elf_info_failed): Add a new field, verdefs.
(NAME(bfd_elf,size_dynamic_sections): Pass verdefs to
elf_export_symbol.
(elf_export_symbol): Check eif->verdefs to decide if a symbol
should be exported.

bfd/ChangeLog
bfd/elflink.h

index 01a9dab04577754dfb2b5f6691ad252e86659175..86f9844f76d1482d35a9accd9829d8845cfd4c2b 100644 (file)
@@ -1,3 +1,11 @@
+2001-06-18  H.J. Lu  <hjl@gnu.org>
+
+       * elflink.h (elf_info_failed): Add a new field, verdefs.
+       (NAME(bfd_elf,size_dynamic_sections): Pass verdefs to
+       elf_export_symbol.
+       (elf_export_symbol): Check eif->verdefs to decide if a symbol
+       should be exported.
+
 2001-06-17  H.J. Lu  <hjl@gnu.org>
 
        * elf32-mips.c (mips_elf_link_hash_entry): Add a new field,
index fca132d7cf0a3ca98a00917cd714e6c4c853811e..21a50414445a6155b69dff68e115d6d572ffd436 100644 (file)
@@ -27,6 +27,7 @@ struct elf_info_failed
 {
   boolean failed;
   struct bfd_link_info *info;
+  struct bfd_elf_version_tree *verdefs;
 };
 
 static boolean elf_link_add_object_symbols
@@ -2967,6 +2968,7 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath,
        }
 
       eif.info = info;
+      eif.verdefs = verdefs;
       eif.failed = false;
 
       /* If we are supposed to export all symbols into the dynamic symbol
@@ -3705,11 +3707,39 @@ elf_export_symbol (h, data)
       && (h->elf_link_hash_flags
          & (ELF_LINK_HASH_DEF_REGULAR | ELF_LINK_HASH_REF_REGULAR)) != 0)
     {
-      if (! _bfd_elf_link_record_dynamic_symbol (eif->info, h))
+      struct bfd_elf_version_tree *t;
+      struct bfd_elf_version_expr *d;
+
+      for (t = eif->verdefs; t != NULL; t = t->next)
        {
-         eif->failed = true;
-         return false;
+         if (t->globals != NULL)
+           {
+             for (d = t->globals; d != NULL; d = d->next)
+               {
+                 if ((*d->match) (d, h->root.root.string))
+                   goto doit;
+               }
+           }
+
+         if (t->locals != NULL)
+           {
+             for (d = t->locals ; d != NULL; d = d->next)
+               {
+                 if ((*d->match) (d, h->root.root.string))
+                   return true;
+               }
+           }
        }
+
+      if (!eif->verdefs)
+        {
+doit:
+         if (! _bfd_elf_link_record_dynamic_symbol (eif->info, h))
+           {
+             eif->failed = true;
+             return false;
+           }
+        }
     }
 
   return true;