OSDN Git Service

* ldgram.y (vers_node): Support anonymous version tags.
authorjakub <jakub>
Tue, 18 Dec 2001 12:15:29 +0000 (12:15 +0000)
committerjakub <jakub>
Tue, 18 Dec 2001 12:15:29 +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 e760aa3..723bfbf 100644 (file)
@@ -1,5 +1,10 @@
 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.
        (struct eh_cie_fde): Add lsda_encoding, lsda_offset,
        make_lsda_relative.
index f5eb277..0087260 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 7ce98c8..c4f9443 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 1967ef5..5594446 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 c57ad15..f1924a0 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 9994cf8..afce0fa 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)
     ;