Skip to content
  • Cary Coutant's avatar
    Fix treatment of symbol versions with unused as-needed libraries. · cea6ffbd
    Cary Coutant authored
    When we have a weak reference to a symbol defined in an
    as-needed library, and that library ends up not-needed, gold
    simply clears the version information in the symbol table, even
    if the symbol could have been resolved by a needed library later
    in the link order. This results in a loss of version information,
    which can cause the program to bind to the wrong version at run
    time.
    
    This patch lets a dynamic definition override an earlier one if
    the earlier one is from a not-needed library, so that we can
    retain the version information from the binding to the needed
    library. In order to do that, the tracking of needed/not-needed
    had to be moved up to symbol resolution time, instead of during
    Symbol_table::set_dynsym_indexes().
    
    In cases where we still end up discarding version information,
    I've added a warning.
    
    For the original problem report and discussion, see:
    
    https://stackoverflow.com/questions/50751421/undefined-behavior-in-shared-lib-using-libpthread-but-not-having-it-in-elf-as-d
    
    gold/
    	* resolve.cc (Symbol_table::resolve): Rename tobinding to
    	orig_tobinding.  Call set_is_needed() for objects that resolve
    	non-weak references.
    	(Symbol_table::should_override): Allow a dynamic definition to
    	override an earlier one in a not-needed library.
    	* symtab.cc (Symbol_table::set_dynsym_indexes): Remove separate
    	processing for as-needed symbols.  Add warning when discarding
    	version informatin.
    	* testsuite/Makefile.am (weak_as_needed): New test case.
    	* testsuite/Makefile.in: Regenerate.
    	* testsuite/weak_as_needed.sh: New test script.
    	* testsuite/weak_as_needed_a.c: New source file.
    	* testsuite/weak_as_needed_b.c: New source file.
    	* testsuite/weak_as_needed_b.script: New version script.
    	* testsuite/weak_as_needed_c.c: New source file.
    	* testsuite/weak_as_needed_c.script: New version script.
    cea6ffbd
To find the state of this project's repository at the time of any of these versions, check out the tags.