* 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.

	* elflink.h (size_dynamic_sections): Skip anonymous version tag.
	(elf_link_assign_sym_version): Don't count anonymous version tag.
This commit is contained in:
Jakub Jelinek 2001-12-18 12:15:35 +00:00
parent b667df2e28
commit 6b9b879a02
6 changed files with 50 additions and 3 deletions

View 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.

View 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;

View 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.

View 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

View 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);
}

View 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)
;