This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gold commit] PR 18703: Fix problems with symbol versioning


PR 18703, and subsequent discussion, raised a couple of problems with
symbol versioning in gold.

If a symbol is defined with ".symver foo,foo@VER", the assembler
creates two symbols in the object: one unversioned, and one with the
(non-default) version "VER". If foo is listed in a version script,
gold would then make the first of those symbols the default version,
and would ignore the second symbol as a duplicate, without making it a
non-default version. While this is arguably reasonable behavior, it
doesn't match Gnu ld behavior, so this patch fixes that by allowing
the second definition to override the first by resetting the "default
version" indication.

Several test cases from the Gnu ld testsuite also exposed another
related problem, where a symbol defined with ".symver foo,foo@",
placed into a shared library, is not handled properly by gold. This
patch also fixes that case, binding the symbol to the base version.

-cary


2015-08-18  Cary Coutant  <ccoutant@gmail.com>

gold/
        PR gold/18703
        * dynobj.cc (Versions::record_version): Handle symbol defined with
        base version.
        (Versions::symbol_section_contents): Likewise.
        * symtab.h (Symbol::set_is_not_default): New class method.
        (Symbol_table::resolve): Add is_default_version parameter.
        (Symbol_table::should_override): Likewise.
        * resolve.cc (Symbol_table::resolve): Add is_default_version parameter,
        and pass to should_override. Adjust all callers and explicit
        instantiations.
        (Symbol_table::should_override): Add is_default_value parameter;
        allow default version in a dynamic object to override existing
        definition from same object.
        * symtab.cc (Symbol_table::add_from_object): Handle case where same
        symbol is defined as unversioned and non-default version in the same
        object.
        * testsuite/Makefile.am (ver_test_13): New test case.
        * testsuite/Makefile.in: Regenerate.
        * testsuite/ver_test_4.cc: Add test for symbol with base version.
        * testsuite/ver_test_4.sh: Likewise.
        * testsuite/ver_test_13.c: New source file.
        * testsuite/ver_test_13.script: New version script.
        * testsuite/ver_test_13.sh: New test case.

Attachment: pr18703.patch
Description: Binary data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]