* ldgram.y (vers_node): Support anonymous version tags.
authorJakub Jelinek <jakub@redhat.com>
Tue, 18 Dec 2001 12:15:35 +0000 (12:15 +0000)
committerJakub Jelinek <jakub@redhat.com>
Tue, 18 Dec 2001 12:15:35 +0000 (12:15 +0000)
* ldlang.c (lang_register_vers_node): Ensure anonymous version
tag is not defined together with non-anonymous versions.
* ld.texinfo: Document it.

* elflink.h (size_dynamic_sections): Skip anonymous version tag.
(elf_link_assign_sym_version): Don't count anonymous version tag.

bfd/ChangeLog
bfd/elflink.h
ld/ChangeLog
ld/ld.texinfo
ld/ldgram.y
ld/ldlang.c

index e760aa3f2b1e04be6d6db709f4caec509d2728b6..723bfbf0afe315591679e7cc409062cac4c1cf61 100644 (file)
@@ -1,3 +1,8 @@
+2001-12-18  Jakub Jelinek  <jakub@redhat.com>
+
+       * elflink.h (size_dynamic_sections): Skip anonymous version tag.
+       (elf_link_assign_sym_version): Don't count anonymous version tag.
+
 2001-12-18  Jakub Jelinek  <jakub@redhat.com>
 
        * elf-eh-frame.c (struct cie): Add make_lsda_relative.
index f5eb2771929cdcbc1bc4424544f30cfa6efc1d52..00872600f1b777df35c9e735785c07b32e7714af 100644 (file)
@@ -3246,6 +3246,10 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath,
          just linking a regular application.  */
       verdefs = asvinfo.verdefs;
 
+      /* Skip anonymous version tag.  */
+      if (verdefs != NULL && verdefs->vernum == 0)
+       verdefs = verdefs->next;
+
       if (verdefs == NULL)
        _bfd_strip_section_from_output (info, s);
       else
@@ -4307,6 +4311,9 @@ elf_link_assign_sym_version (h, data)
          t->used = true;
 
          version_index = 1;
+         /* Don't count anonymous version tag.  */
+         if (sinfo->verdefs != NULL && sinfo->verdefs->vernum == 0)
+           version_index = 0;
          for (pp = &sinfo->verdefs; *pp != NULL; pp = &(*pp)->next)
            ++version_index;
          t->vernum = version_index;
index 7ce98c84c9bcb97c285fa7582270abae1af65ea8..c4f94433b92bbc9290b41cad225d6b34e23aea7f 100644 (file)
@@ -1,3 +1,10 @@
+2001-12-18  Jakub Jelinek  <jakub@redhat.com>
+
+       * ldgram.y (vers_node): Support anonymous version tags.
+       * ldlang.c (lang_register_vers_node): Ensure anonymous version
+       tag is not defined together with non-anonymous versions.
+       * ld.texinfo: Document it.
+
 2001-12-18  Nick Clifton  <nickc@cambridge.redhat.com>
 
        * po/tr.po: New file: Turkish translation.
index 1967ef5d99b5b48d51b9b14ee4fec5fba932a267..5594446ffd451f8af18b5011adab593d5627308a 100644 (file)
@@ -3685,6 +3685,15 @@ they might suggest to the person reading them.  The @samp{2.0} version
 could just as well have appeared in between @samp{1.1} and @samp{1.2}.
 However, this would be a confusing way to write a version script.
 
+Node name can be omited, provided it is the only version node
+in the version script.  Such version script doesn't assign any versions to
+symbols, only selects which symbols will be globally visible out and which
+won't.
+
+@smallexample
+@{ global: foo; bar; local: *; @}
+#end smallexample
+
 When you link an application against a shared library that has versioned
 symbols, the application itself knows which version of each symbol it
 requires, and it also knows which version nodes it needs from each
index c57ad158163b22239f4a273bd746af4a38a99328..f1924a0069efd8e1269da615b42773685397a24f 100644 (file)
@@ -1061,7 +1061,11 @@ vers_nodes:
        ;
 
 vers_node:
-               VERS_TAG '{' vers_tag '}' ';'
+               '{' vers_tag '}' ';'
+               {
+                 lang_register_vers_node (NULL, $2, NULL);
+               }
+       |       VERS_TAG '{' vers_tag '}' ';'
                {
                  lang_register_vers_node ($1, $3, NULL);
                }
index 9994cf8c9896ddd2c6862ca5c0b4bf13b54f2ae9..afce0fa5c23f9c354c3c8451ce7da1c7c9ae1456 100644 (file)
@@ -5031,6 +5031,16 @@ lang_register_vers_node (name, version, deps)
   struct bfd_elf_version_tree *t, **pp;
   struct bfd_elf_version_expr *e1;
 
+  if (name == NULL)
+    name = "";
+
+  if ((name[0] == '\0' && lang_elf_version_info != NULL)
+      || (lang_elf_version_info && lang_elf_version_info->name[0] == '\0'))
+    {
+      einfo (_("%X%P: anonymous version tag cannot be combined with other version tags\n"));
+      return;
+    }
+
   /* Make sure this node has a unique name.  */
   for (t = lang_elf_version_info; t != NULL; t = t->next)
     if (strcmp (t->name, name) == 0)
@@ -5067,8 +5077,13 @@ lang_register_vers_node (name, version, deps)
 
   version->deps = deps;
   version->name = name;
-  ++version_index;
-  version->vernum = version_index;
+  if (name[0] != '\0')
+    {
+      ++version_index;
+      version->vernum = version_index;
+    }
+  else
+    version->vernum = 0;
 
   for (pp = &lang_elf_version_info; *pp != NULL; pp = &(*pp)->next)
     ;